>백엔드 개발 >파이썬 튜토리얼 >내 중첩 함수가 상위 함수에 있는 지역 변수의 최종 값에만 액세스하는 이유는 무엇입니까?

내 중첩 함수가 상위 함수에 있는 지역 변수의 최종 값에만 액세스하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-16 12:49:14467검색

Why Does My Nested Function Only Access the Final Value of a Local Variable in Its Parent Function?

중첩 함수의 지역 변수

중첩 함수는 상위 함수 내에 특정 기능을 캡슐화하는 편리한 수단을 제공합니다. 그러나 폐쇄 동작으로 인해 지역 변수의 접근성 및 값과 관련하여 몇 가지 문제가 발생할 수 있습니다.

문제:

다음 코드 조각을 고려하세요.

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())

원하는 동작은 각각 세 가지 다른 동물('소', '개', '고양이')을 인쇄하는 것입니다. 반복. 그러나 프로그램은 모든 반복에 대해 'cat'만 인쇄합니다. 이 동작은 지역 변수 케이지가 중첩 함수와 연관되어 있다는 기대와 모순됩니다.

답변:

오해는 중첩 함수가 참조를 저장한다는 가정에 있습니다. 정의되면 상위 범위의 지역 변수에 적용됩니다. 실제로 중첩 함수는 실행될 때만 상위 범위에서 변수를 조회합니다.

이 특정 예에서 pet_function에 대해 생성된 클로저는 get_petters 함수에서 케이지 변수를 인덱싱합니다. pet_function이 호출되면 케이지 값을 검색하기 위해 클로저에 액세스합니다. 그러나 그 시점에서는 get_petters 함수가 완료되었으며 케이지 변수의 최종 값은 'cat'입니다. 따라서 pet_function 변형에 대한 모든 후속 호출은 'cat' 값을 반환합니다.

해결 방법:

이 문제를 해결하려면 다양한 기술을 사용하여 중첩 함수는 케이지의 올바른 값에 액세스합니다:

  • 부분 함수: functools.partial을 활용하여 케이지에 대한 고정 값을 가진 새 함수를 생성합니다.
  • 범위 함수: 루프 내에서 새 함수를 생성하여 pet_function의 각 인스턴스에 대해 고유한 범위를 보장합니다.
  • 기본 매개변수 값: 케이지를 기본 매개변수 값으로 전달합니다. pet_function.

이러한 접근 방식 중 하나를 사용하면 중첩 함수가 각 반복마다 의도한 지역 변수에 액세스하도록 할 수 있습니다.

위 내용은 내 중첩 함수가 상위 함수에 있는 지역 변수의 최종 값에만 액세스하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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