어휘 클로저 이해: Python 수수께끼
함수형 프로그래밍 영역에서 어휘 클로저는 중요한 역할을 합니다. 그러나 특정 프로그래밍 언어는 동작을 이해하는 데 복잡성을 초래할 수 있습니다. 예를 들어 Python은 클로저와 환경의 상호 작용을 보여주는 흥미로운 퍼즐을 제공합니다.
다음 Python 코드 조각은 예를 들어 제공됩니다.
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
이 코드는 놀랍게도 "4 4"를 인쇄합니다. 예상되는 "0 2 4" 대신 4"입니다. 처음에는 전역 변수 i가 함수 간에 공유되는 것으로 의심할 수 있지만 i가 중첩된 함수 내에서 로컬로 선언된 경우에도 문제가 지속됩니다.
이 동작을 이해하는 열쇠는 클로저의 개념에 있습니다. Python에서 각 중첩 함수는 포함 범위의 클로저를 유지합니다. 이 경우 중첩된 함수는 변경 가능한 변수 i를 포함하여 전역 환경의 폐쇄를 공유합니다. 루프 중에 i가 수정되므로 모든 함수는 수정된 값을 참조합니다.
이 문제를 피하고 원하는 동작을 보장하려면 함수 생성자 접근 방식을 사용할 수 있습니다. 인라인으로 함수를 생성하는 대신 생성자 함수를 호출함으로써 생성된 각 함수에 대해 고유한 환경이 설정됩니다.
수정된 코드의 예는 다음과 같습니다.
flist = [] for i in xrange(3): def funcC(j): def func(x): return x * j return func flist.append(funcC(i)) for f in flist: print f(2)
이 접근 방식은 다음을 사용하여 별도의 함수를 효과적으로 생성합니다. 고유한 클로저를 사용하여 "0 2 4"라는 예상 출력을 얻습니다.
따라서 클로저는 강력한 기능을 제공하지만 환경에서는 미묘한 복잡성이 발생할 수 있습니다. 클로저의 잠재력을 최대한 활용하려면 범위와 클로저의 미묘한 차이를 신중하게 고려하는 것이 필수적입니다.
위 내용은 이 Python 클로저 예제는 왜 \'0 2 4\' 대신 \'4 4 4\'를 인쇄합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!