어휘 클로저의 복잡성을 자세히 살펴보면 Python 코드의 특이한 동작이 분명하게 드러납니다. 다음 예를 고려해 보세요.
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
놀랍게도 이 코드는 예상된 "0 2 4" 대신 "4 4 4"를 인쇄합니다. 이 예상치 못한 동작은 Python이 어휘 클로저를 처리하는 방식에서 비롯됩니다.
각 반복마다 새 클로저를 생성하는 Perl과 달리 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)
이 수정된 코드는 문제를 수정하여 Python 작동 방식의 미묘하지만 중요한 차이점을 보여줍니다. Perl은 어휘 폐쇄를 처리합니다. 사용되는 특정 프로그래밍 언어의 폐쇄 동작을 이해함으로써 개발자는 예상치 못한 결과를 방지하고 더욱 강력하고 예측 가능한 코드를 작성할 수 있습니다.
위 내용은 Python의 폐쇄 동작이 중첩 루프에서 예기치 않은 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!