-
[Python] 스코프 규칙언어/파이썬 & 장고 2017. 1. 18. 14:47
파이썬에는 지역, 전역, 내장 스코프를 지원합니다.
- 지역 스코프: 함수 내부에서 생성되는 스코프
- 전역 스코프: 모듈(파이썬 파일) 스코프
- 내장 스코프: 파이썬 자체 내장 영역 스코프
각각의 스코프 특성 때문에 변수의 트성도 지역과 전역으로 나뉘어 집니다. 파이썬이 지역과 전역을 선언할 때 전역변수를 선언하거나 명시할 때 global 키워드를 사용해야 합니다.
def func_scope(): print(a) a = 100 func_scope() # 결과 # 100
위의 예제와 같이 전역변수를 참조만 하여 사용할 때 (전역변수의 수정이 일어나지 않을 때)는 global 키워드 없이 그대로 사용할 수 있습니다.
def func_scope(): print(a) a = 200 print(a) a = 100 func_scope() # 결과 # Traceback (most recent call last): # File "<string>", line 13, in <module> # File "<string>", line 6, in func_scope # UnboundLocalError: local variable 'a' referenced before assignment
위의 예제와 같이 전역(모듈 네임 스페이스) 공간에 있는 변수 a를 func_scope()에서 수정하고자 하면 에러가 발생합니다. 변수 a가 함수 내부의 지역 스코프에 선언되어 있지 않기 때문에 값을 변경할 수 없습니다.
위와 같이 참조만 하면 사용할 수 있는데 수정을 하려고하면 에러가 나는 이유는 변경하려는 자료형 타입이 수정할 수 없는 타입이기 때문입니다. 아래의 코드처럼 수정할 수 있는 타입을 전역에 선언하고 값을 수정한다면 에러없이 실행됨을 볼 수 있습니다.
def func_scope(): print(a) a['key'] = 'value' a = {} func_scope() print(a) #결과 # {} # {'key': 'value'}
만약 전역 네임스페이스에 선언된 변수가 변경할 수 없는 타입이라면 global 키워드를 앞에 붙여 해당 변수가 전역 네임스페이스에 있다는 것을 알려야 합니다.
def func_scope(): global a print(a) a = 200 print(a) a = 100 func_scope() # 결과 # 100 # 200