> 백엔드 개발 > 파이썬 튜토리얼 > Python의 어휘 폐쇄 동작이 Perl의 어휘 폐쇄 동작과 다른 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

Python의 어휘 폐쇄 동작이 Perl의 어휘 폐쇄 동작과 다른 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-01 14:46:13
원래의
787명이 탐색했습니다.

Why Does Python's Lexical Closure Behavior Differ from Perl's, and How Can This Be Resolved?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿