>백엔드 개발 >파이썬 튜토리얼 >이 Python 클로저 예제는 왜 \'0 2 4\' 대신 \'4 4 4\'를 인쇄합니까?

이 Python 클로저 예제는 왜 \'0 2 4\' 대신 \'4 4 4\'를 인쇄합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-29 08:12:10271검색

Why Does This Python Closure Example Print

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.