Python과 Perl의 어휘 클로저 해독
Javascript의 어휘 클로저를 탐색하는 동안 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"가 출력됩니다.
반대로, 이 동등한 Perl 코드는 원하는 결과를 생성합니다. 결과:
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print $f->(2), "\n"; }
기본 차이점
주요 차이점은 클로저가 환경을 캡처하는 방법에 있습니다.
Python 솔루션
기대치를 달성하려면 Python에서 동작하려면 각 함수에 대해 별도의 환경을 강제해야 합니다. 한 가지 해결책은 다른 클로저를 사용하여 함수를 반환하는 함수 생성기를 만드는 것입니다.
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)
이 방법을 사용하면 각 함수에 고유한 i 값을 갖는 고유한 클로저가 있습니다.
위 내용은 Python의 어휘 폐쇄 동작이 Perl과 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!