파이썬에는 지역, 전역, 내장 스코프를 지원합니다.

  • 지역 스코프: 함수 내부에서 생성되는 스코프
  • 전역 스코프: 모듈(파이썬 파일) 스코프
  • 내장 스코프: 파이썬 자체 내장 영역 스코프

각각의 스코프 특성 때문에 변수의 트성도 지역과 전역으로 나뉘어 집니다. 파이썬이 지역과 전역을 선언할 때 전역변수를 선언하거나 명시할 때 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


+ Random Posts