프로그래밍파이썬 개발자

파이썬은 중첩 함수(클로저) 작업 메커니즘을 어떻게 구현합니까? 클로저는 무엇에 사용되며, 어떤 함정이 있으며 외부 함수의 변수를 어떻게 올바르게 수정할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

파이썬에서 클로저는 외부 변수의 값을 "기억하는" 함수로, 외부 변수의 범위를 벗어나 호출되더라도 가능합니다. 클로저는 내부 함수가 외부 함수에서 정의된 변수를 참조할 때 생성됩니다. 파이썬 3에서 내부 함수에서 이러한 변수를 수정하려면 nonlocal 키워드를 사용해야 합니다.

예:

def make_accumulator(): total = 0 def add(value): nonlocal total total += value return total return add acc = make_accumulator() print(acc(10)) # 10 print(acc(5)) # 15

nonlocal이 없으면 변수 total은 수정할 수 없습니다 (UnboundLocalError 오류).

함정을 포함한 질문.

질문: "내부 함수에서 nonlocal 키워드 없이 외부 함수의 변수를 증가시킬 수 있습니까?"

답변: 아니요, nonlocal 없이 수행하면 오류가 발생합니다. 인터프리터는 변수를 내부 함수의 로컬로 간주할 것입니다. 예:

def outer(): count = 0 def inner(): count += 1 # UnboundLocalError 오류 return count return inner

주제의 미세한 차이를 모름으로 인해 발생한 실제 오류 사례.


이야기 어떤 웹 애플리케이션에서 중첩 함수를 통해 각 핸들러에 대해 로컬 카운터를 구현하고 싶었으나 nonlocal 사용을 잊어버렸습니다. 카운터는 항상 1을 반환했으며, 이는 카운트를 로컬 스코프에서 계산하고 외부 클로저와 연결되지 않은 새로운 값을 증가시켰기 때문입니다.


이야기 다중 스레드 문제에서 클로저와 람다를 자주 사용하는데, 클로저에 대한 이해가 부족하여 모든 람다 함수가 반복문 변수의 마지막 값을 "기억하는" 상황이 발생했습니다. 이로 인해 작업이 서로 복사되어 처리되지 않았습니다.


이야기 정확한 클로저를 사용하지 않고 데코레이터를 구현한 결과, 호출 간 상태를 누적할 수 없게 되어 예기치 않은 결과와 불안정한 애플리케이션 동작이 발생했습니다.