[python] nonlocal

gunny·2025년 2월 12일
0

Python

목록 보기
31/35

nonlocal

  • nonlocal 은 중첩함수(nested function)에서 바깥 함수의 변수를 수정할 수 있도록 하는 키워드이다.
  • nonlocal을 사용하면 바깥 함수의 지역 변수에 접근하고 수정할 수 있다.

nonlocal의 필요성

  • python에서는 일반적으로 내부 함수가 바깥 함수의 변수에 접근을 할 수 있지만 수정은 할 수 없다.
    nonlocal을 사용하면 내부 함수에서 바깥 함수의 변수를 변경할 수 있다.
  • 주로 클로저(Closure)에서 상태를 유지하거나 수정할 때 유용하다

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_functioncount 변수를 수정할 수 있다.
    이제 inner_function이 실행될 때 count가 1이 증가하고, 1이 출력된다.

nonlocal 주요 특징

  • 중첩된 함수에서 바깥 함수의 변수를 수정할 수 있게 해준다.
  • 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는 클로저를 반환한다. 각 counter1counter2는 각각 독립된 count 변수를 가지며, nonlocal을 사용하여 그 값을 갱신한다. 각 카운터는 독립적으로 상태를 유지하고, 상태가 외부에서 수정되지 않도록 보호된다.

결론

  • nonlocal 은 중첩 함수에서 바깥 함수의 변수를 수정할 때 사용하는 키워드
  • 내부 함수가 외부 함수의 지역 변수에 접근하고 값을 변경할 수 있게 됨
  • nonlocal은 전역 변수에는 영향을 미치지 않으며, 중첩된 함수에서만 바깥 함수의 변수를 수정할 수 있게 해줌
profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글