루프 내의 Lambda 함수
Python에서 람다 함수는 익명 함수를 정의하는 간결한 방법을 제공합니다. 그러나 루프 내에서 사용할 경우 적절한 바인딩이 보장되지 않으면 예기치 않은 동작이 발생할 수 있습니다.
다음 코드 조각을 고려하세요.
directorys = {'login': <object>, 'home': <object>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
사전 매핑 명령을 만드는 것이 목적입니다. 디렉토리를 변경하는 함수에 대한 문자열입니다. 그러나 결과는 예상치 못한 것입니다. 생성된 두 개의 람다 함수는 동일하고 동일한 명령을 실행하여 디렉터리를 "login"으로 변경합니다.
왜 이런 일이 발생합니까?
루프 내의 Lambda 함수는 동일한 함수 범위를 공유합니다. 이는 람다 함수에 의해 캡처된 변수가 루프의 모든 반복에서 동일하다는 것을 의미합니다. 이 경우 "d"는 "directorys" 사전의 마지막 항목인 "login"의 값을 나타냅니다.
문제 해결
올바르게 바인딩하려면 각 람다 함수가 고유한 "d" 값에 액세스할 수 있는지 확인해야 합니다. 한 가지 접근 방식은 "d"를 기본값이 있는 매개 변수로 전달하는 것입니다.
lambda d=d: self.root.change_directory(d)
루프의 각 반복에서 기본값 "d"를 현재 값 "d"로 설정하면 각 람다 함수에 대해 고유한 클로저를 만듭니다. 또는 추가 클로저 기술을 사용하여 동일한 결과를 얻을 수 있습니다.
(lambda d=d: lambda: self.root.change_directory(d))()
이 외부 람다 함수는 "d"에 대한 클로저를 생성하고 내부 람다 함수는 클로저의 "d"를 사용합니다.
위 내용은 Python 루프의 Lambda 함수가 때때로 제대로 바인딩되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!