함수는 코드 내부에 Local scope를 생성하며, 그 외의 공간은 global scope로 구분
built-in scope : 파이썬이 실행된 이후부터 영원히 유지
global scope : 모듈이 호출된 시점 이후 혹은 인터프리터가 끝날 때까지 유지
local scope : 함수가 호출될 때 생성되고, 함수가 종료될 때까지 유지
def func():
a = 20 # local scope에만 존재하는 변수 a
print('local', a) # local 20
func()
print('global', a) # NameError: name 'a' is not defined
)
print()
a = 0
b = 1
def enclosed():
a = 10
c = 3
def local(c):
print(a, b, c) # 10 1 300
local(300)
print(a, b, c) # 10 1 3
enclosed()
print(a, b) # 0 1
현재 코드 블록 전체에 적용되며, 나열된 식별자(이름)가 global variable임을 나타냄
global
에 나열된 이름은 같은 코드 블록에서 global
앞에 등장할 수 없음global
에 나열된 이름은 parameter, for 루프 대상, 클래스/함수 정의 등으로 정의되지 않아야 함a = 10
def func()
global a
a = 3
print(a) # 10
func()
print(a) # 3
# 1. global에 나열된 이름은 같은 코드 블록에서 global 앞에 등장할 수 없음.
a = 10
def func():
print(a) # global a 선언 전에 사용
global a
a = 3
print(3)
func()
print(a)
# SyntaxError: name 'a' is used prior to global declaration
# 2. global에 나열된 이름은 parameter, for 루프 대상, 클래스/함수 정의 등으로
# 정의되지 않아야 함
b = 10
def func1(b)
global b # parameter에 global 사용 불가
b = 3
print(b)
func1(b)
print(b)
# SyntaxError: name 'b' is parameter and global
global
을 제외하고 가장 가까운 (둘러 싸고 있는) scope의 변수를 연결하도록 함nonlocal
에 나열된 이름은 같은 코드 블록에서 nonlocal 앞에 등장할 수 없음nonlocal
에 나열된 이름은 parameter, for 루프 대상, 클래스/함수 정의 등으로 정의되지 않아야 함global
과 달리 이미 존재하는 이름과의 연결만 가능x = 0
def func1():
x = 1
def func2():
nonlocal x # enclosed scope(func1)의 변수 x에 영향
x = 2 # enclosed scope(func1)의 변수 x를 2로 변경
func2()
print(x) # 2
func1()
print(x) # 0
# 선언된 적 없는 변수의 활용
def func():
global out
out = 3
func()
print(out) # 3
# 선언된 적 없는 변수의 활용
def func1():
def func2():
nonlocal y
y = 2
func2()
print(y)
func1()
'''
SyntaxError: no binding for
nonlocal 'y' found
'''
📢 `nonlocal`은 이름 공간상에 존재하는 변수만 가능
global
, nonlocal
키워드 사용