중첩 함수의 지역 변수
이 복잡한 예에는 중첩 함수와 클로저가 포함되어 있어 동작이 혼란스러울 수 있습니다. 미스터리를 풀어봅시다.
중첩 함수 실행
중첩 함수는 실행될 때 상위 범위의 변수에 액세스합니다. 이 경우 pet_function은 get_petters 생성기 내의 중첩 함수입니다. 실행되면 get_petters 범위의 변수를 검색합니다.
클로저 셀 및 로컬 변수
pet_function에는 하나의 자유 변수(cage)가 있습니다. 컴파일하는 동안 이 자유 변수는 클로저 셀로 표시됩니다. pet_function이 실행되면 이 클로저 셀은 get_petters 주변 범위의 케이지 값을 확인합니다.
동적 조회 및 클로저
funs 목록이 실행될 때 문제가 되는 동작이 발생합니다. 생성됩니다. 이 시점에서 get_petters의 케이지에는 'cat' 값이 있습니다. funs의 각 함수가 호출되면 pet_function의 클로저 셀은 정의된 때가 아닌 해당 함수 호출 당시의 케이지 값을 조회합니다.
다른 동물에 액세스
이 문제를 해결하려면 pet_function이 각 동물에 대한 케이지 개체의 특정 인스턴스에 액세스해야 합니다. 이는 부분 함수, 새 함수 범위 또는 키워드 매개변수를 통해 달성할 수 있습니다.
부분 함수
부분 함수는 고정 매개변수를 사용하여 새 함수를 생성합니다. 다음은 functools.partial()을 사용하는 예입니다.
def pet_function(cage=None): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
새 함수 범위
새 함수 범위를 생성하면 케이지 변수가 새로 정의된 범위 내에 바인딩됩니다. 기능.
def scoped_cage(cage=None): def pet_function(): print("Mary pets the " + cage.animal + ".") return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
키워드 매개변수
케이지 변수를 키워드 매개변수의 기본값으로 바인딩:
def pet_function(cage=cage): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, pet_function))
위 내용은 중첩된 함수는 Python에서 지역 변수와 클로저를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!