중첩 함수의 지역 변수: 클로저 및 조회 이야기
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!