Python의 어휘 클로저 이해: 심층 조사
프로그래밍 영역에서 어휘 클로저는 변수에 대한 액세스를 유지하는 데 중요한 역할을 합니다. 및 바깥쪽 범위에 정의된 함수. 그러나 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)
놀랍게도 이 코드는 예상된 "0 2 4" 대신 "4 4 4"를 인쇄합니다. 이 동작을 이해하려면 Python의 어휘 클로저의 특성을 자세히 조사해야 합니다.
Python 및 Perl의 클로저 동작
Python에서 클로저는 변수에 대한 참조를 유지합니다. 둘러싸는 범위에서. 그러나 이러한 변수가 해당 범위 내에서 수정되면 클로저는 수정된 값을 캡처하여 예상치 못한 결과를 초래합니다.
이 동작은 클로저가 생성 당시 환경을 캡처하는 Perl과 대조됩니다. Perl 코드에서:
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); }
각 클로저는 생성 당시 $i의 값을 캡처하여 예상 출력은 "0 2 4."입니다.
수수께끼 해결
Python에서 문제를 해결하기 위해 다른 함수 내에 함수를 만들어 격리할 수 있습니다. 클로저의 환경.
flist = [] def outer(): for i in xrange(3): def inner(x): return x * i flist.append(inner) outer() for f in flist: print f(2)
여기서 외부 루프의 각 반복은 고유한 환경과 고유한 i 값을 갖는 새로운 함수를 생성합니다. 그 결과, 원하는 출력인 "0 2 4"를 얻습니다.
결론
어휘 클로저는 범위 전체에서 변수와 함수에 액세스하기 위한 강력한 메커니즘을 제공합니다. 그러나 Python에서는 예기치 않은 동작이 발생할 수 있으므로 변경 가능한 변수를 닫는 것의 의미를 이해하는 것이 중요합니다. 클로저가 생성되는 환경을 주의 깊게 관리함으로써 함정을 피하면서 클로저의 잠재력을 최대한 활용할 수 있습니다.
위 내용은 Python의 어휘 폐쇄 동작이 Perl의 어휘 폐쇄 동작과 다른 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!