중첩 함수는 상위 함수 내에 특정 기능을 캡슐화하는 편리한 수단을 제공합니다. 그러나 폐쇄 동작으로 인해 지역 변수의 접근성 및 값과 관련하여 몇 가지 문제가 발생할 수 있습니다.
문제:
다음 코드 조각을 고려하세요.
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' 값을 반환합니다.
해결 방법:
이 문제를 해결하려면 다양한 기술을 사용하여 중첩 함수는 케이지의 올바른 값에 액세스합니다:
이러한 접근 방식 중 하나를 사용하면 중첩 함수가 각 반복마다 의도한 지역 변수에 액세스하도록 할 수 있습니다.
위 내용은 내 중첩 함수가 상위 함수에 있는 지역 변수의 최종 값에만 액세스하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!