반응형
2. 파이썬 심화 - 변수
변수
뒷부분에 나올 클로저를 알기 위해서는 반드시 개념을 숙지하고 지나가야 하는 부분이다.
전역 변수(Global variable)
- 함수 밖에서 만들어진 변수
- 프로그램 전체에서 동작
- 프로그램이 복잡해질수록 골치 아파지는 변수
전역 변수 예제
# 전역변수 예제
x = 100
def val():
print(x) # 전역변수
val()
print(x)
# Output
# >>> 100
# >>> 100
지역변수(Local variable)
- 함수 안에서 만들어 진 변수 그래서 함수 내부에서 동작
- 함수의 외부에서는 지역변수를 호출 x
지역변수 예제
## 지역변수 예제
x = 100
def val():
x = 10 # 지역변수 -> 함수 외부에서 호출 x
print(x)
val()
print(x)
# Output
# >>> 10
# >>> 100
함수 안에서 전역 변수의 값을 변경 - Global 사용
- 함수안에서 전역 변수의 값을 변경하려면 global
- 함수의 단계 상관없이
global
키워드를 사용하면 무조건 전역 변수를 사용하게 된다.
x = 100
def val():
global x # 전역변수로 선언
x = 10 # 지역변수 x -> 전역변수로 변경
print(x)
val()
print(x)
# Output
# >>> 100
# >>> 100
다중 함수 - global
사용
## global 사용
x = 1 # 1번
def fstPhase():
x = 50 # 2번
def fstPart():
x = 70 # 3번
def fstStep():
global x # 1번 변수를 호출해서 사용
x = x + 80 # 1 + 80 = 81
print(x)
fstStep()
fstPart()
fstPhase()
# Output
# >>> 81
함수에서 값을 주고 받을 경우에는 매개 변수와 변환 값을 사용하는 것이 좋다.
왜냐하면 전역 변수는 코드가 복잡할 때 변수의 값을 어디서 바꾸는지 알기가 힘들기 때문이다.
그래서 전역변수는 가급적이면 사용하지 않는 것을 권한다.
상위 함수의 지역변수 호출 - nonlocal
사용
파이썬에서는 함수에서 변수를 만들면 항상 현재 함수의 지역변수가 된다.
## 지역변수 변경
def Outer():
x = 35 # Outer의 지역변수 x
def Inner():
x = 25 # Inner의 지역변수 x
Inner()
print(x) # 지역변수 출력
Outer()
# Output
# >>> 35 -> 당연한 결과 -> Outer함수의 지역변수를 호출
이중 함수 안의 지역변수를 이중 함수 밖(Outer에서)에서
즉, Inner의 지역변수 x를 외부에서 호출하려면 nonlocal
을 사용하면 된다.
# Inner의 x를 출력하려면
def Outer():
x = 35
# 지역변수 x
def Inner():
nonlocal x # 현재 함수의 외부에서 이 지역변수를 사용 가능
# -> 잘 사용 할 일은 없을것
x = 25
Inner()
print(x) # 지역변수 출력
Outer()
# Output
# >>> 25 # Outer함수의 지역변수가 아니라 Inner함수의 지역변수를 호출
nonlocal
을 어디서, 왜 써야 하는지 감이 안 와서 이해를 위해 조금 더 알아봤다.
def Outer():
x = 10
def Inner():
x += 10
print('x:', x)
Inner()
Outer()
# Output
# >>> UnboundLocalError: local variable 'a' referenced before assignment
이 경우 UnboundLocalError: local variable 'a' referenced before assignment
라는
에러가 발생하는데,
이 에러는 해당 범위 내에서 변수를 할당을 할 때
할당되는 변수가 파이썬에 의해서 자동적으로 로컬 변수로 간주되어서 발생한 에러이다.
그래서 변수에 용도에 맞도록 nonlocal
혹은 global
이름표를 달아 주어야한다.
아래 예제의 경우에 nonlocal
을 사용한다.
# nonlocal을 추가
def Outer():
x = 10
def Inner():
nonlocal x # 추가된 항목
x += 10
print('a:', x)
Inner()
Outer()
# Output
# >>> a: 20
Reference
- 파이썬 코딩도장 : https://dojang.io/
- SchoolOfWeb : http://schoolofweb.net/
- 끝나지 않는 프로그래밍 일기 : https://blog.hexabrain.net/347
'Programming > Python' 카테고리의 다른 글
[ Python_심화 ] 4. 클래스_02 (0) | 2020.06.27 |
---|---|
[ Python_심화 ] 4. 클래스_01 (2) | 2020.06.26 |
[ Python_심화 ] 3. 클로저(Closure) (0) | 2020.06.25 |
[ Python_심화 ] 1. 재귀호출 (0) | 2020.06.25 |
[Python] 데이터 획득 Lv정리 (0) | 2019.08.16 |