> 백엔드 개발 > 파이썬 튜토리얼 > 클로저는 중첩된 Python 함수의 지역 변수 액세스에 어떤 영향을 줍니까?

클로저는 중첩된 Python 함수의 지역 변수 액세스에 어떤 영향을 줍니까?

Linda Hamilton
풀어 주다: 2024-12-18 09:29:18
원래의
406명이 탐색했습니다.

How Do Closures Affect Local Variable Access in Nested Python Functions?

중첩 함수의 지역 변수: 클로저 및 조회 이야기

Python에서 중첩 함수 내에 정의된 지역 변수는 주변 변수와 상호 작용할 수 있습니다. 범위. 이 상호 작용을 이해하기 위해 동작을 강조하는 코드 조각을 자세히 살펴보겠습니다.

from functools import partial

class Cage(object):
    def __init__(self, animal):
        self.animal = animal

def gotimes(do_the_petting):
    do_the_petting()

def get_petters():
    for animal in ['cow', 'dog', 'cat']:
        cage = Cage(animal)

        def pet_function():
            print "Mary pets the " + cage.animal + "."

        yield (animal, partial(gotimes, pet_function))

funs = list(get_petters())

for name, f in funs:
    print name + ":",
    f()
로그인 후 복사

모호한 할당

이 코드를 실행하면 다음과 같은 예상치 못한 결과가 발생합니다. 고양이"는 세 동물("소", "개", "고양이") 모두에 대해 인쇄됩니다. 이는 중첩 함수 pet_function 내의 지역 변수 케이지가 클로저 셀로 캡처되기 때문입니다.

클로저 셀

중첩 함수가 생성되면 로컬 변수를 참조합니다. 상위 범위의 변수. 이 경우, 케이지는 pet_function의 유일한 자유 변수이며 클로저 셀에 바인딩됩니다. 이 셀을 사용하면 상위 함수가 반환된 후에도 함수가 외부 범위의 변수에 액세스할 수 있습니다.

범위 확인

그러나 문제는 중첩된 함수가 실행될 때 발생합니다. Cage의 값은 정의가 아닌 실행 시 주변 범위에서 조회됩니다. 우리의 경우 함수가 호출될 때 주변 범위의 케이지 변수에 이미 최종 값으로 "cat"이 할당되어 있습니다.

해결 방법

이 모호함을 해결하려면 클로저를 해제하고 중첩된 함수가 주변 범위에 직접 액세스하지 못하도록 해야 합니다. 다음은 몇 가지 해결 방법입니다.

  • 부분 함수: 부분 함수를 만들고 원하는 인수를 키워드 매개 변수로 바인딩합니다.
  • 새 함수 범위 : 원하는 인수를 자체적으로 캡처하는 새 중첩 함수를 만듭니다. 범위.
  • 기본값 바인딩: 변수를 기본 매개변수 값으로 중첩 함수에 바인딩합니다.

이러한 해결 방법을 사용하면 다음을 보장할 수 있습니다. 중첩 함수는 올바른 지역 변수에 액세스할 수 있으며 코드의 모호성을 방지합니다.

위 내용은 클로저는 중첩된 Python 함수의 지역 변수 액세스에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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