nonlocal
은 중첩함수(nested function)에서 바깥 함수의 변수를 수정할 수 있도록 하는 키워드이다. nonlocal
을 사용하면 바깥 함수의 지역 변수에 접근하고 수정할 수 있다.nonlocal
을 사용하면 내부 함수에서 바깥 함수의 변수를 변경할 수 있다.case 1. nonlocal
없이 바깥 변수 수정하기
def outer_function():
count = 0 # 바깥 함수의 변수
def inner_function():
count += 1 # 바깥 함수의 변수 수정 시도 (에러 발생)
print(count)
inner_function()
outer_function()
inner_function
에서 count
값을 증가시키려고 하지만, 파이썬에서는 내부 함수에서 외부 함수의 변수를 수정하려면 nonlocal
을 사용해야 하기 때문에 UnboundLocalError
가 발생한다.case 2. nonlocal
을 사용해서 바깥 변수 수정하기
def outer_function():
count = 0 #바깥 함수의 변수
def inner_function():
nonlocal count # 바깥 함수의 count에 접근하고 수정
count +=1
print(count)
inner_function() # 1 출력
nonlocal
count
를 사용하면 inner_function
에서 outer_function
의 count
변수를 수정할 수 있다.inner_function
이 실행될 때 count
가 1이 증가하고, 1이 출력된다.nonlocal
을 사용하지 않으면, 내부 함수는 외부 함수의 변수를 참조만 할 수 있고 수정할 수는 없다.global
)과 지역변수(local
)의 차이를 구분하여, nonlocal
은 바깥 함수에서 정의된 변수를 수정하는데 사용된다.nonlocal
은 전역 변수에는 영향을 미치지 않으며, 오직 내부 함수가 중첩된 함수의 바깥 함수에서 정의된 변수만 수정할 수 있다. nonlocal
을 활용한 클로저 (상태유지)def counter():
count = 0 # 외부 함수의 상태
def increment():
nonlocal count # 외부 함수 count 변수에 접근
count +=1
return count
return increment
counter1 = counter()
counter2 = counter()
print(counter1())
print(counter1())
print(counter2())
print(counter2())
counter
는 클로저를 반환한다. 각 counter1
과 counter2
는 각각 독립된 count
변수를 가지며, nonlocal
을 사용하여 그 값을 갱신한다. 각 카운터는 독립적으로 상태를 유지하고, 상태가 외부에서 수정되지 않도록 보호된다.nonlocal
은 중첩 함수에서 바깥 함수의 변수를 수정할 때 사용하는 키워드nonlocal
은 전역 변수에는 영향을 미치지 않으며, 중첩된 함수에서만 바깥 함수의 변수를 수정할 수 있게 해줌