다음 코드 조각을 고려하세요.
# directorys == {'login': <object at ...>, 'home': <object at ...>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
목표는 키를 사용하여 두 함수의 사전을 만드는 것입니다. CD 로그인' 및 'CD 홈'. 그러나 결과는 두 람다 함수 모두 "cd login" 키를 사용하여 동일한 내용을 갖고 있음을 보여줍니다.
이 예상치 못한 동작을 이해하려면 중첩 루프에서 람다 함수가 작동하는 방식을 고려하는 것이 중요합니다. 람다 함수가 루프 내에 정의되면 주변 범위에서 변수를 캡처합니다. 이 경우 루프의 변수 d는 각 람다 함수에 의해 캡처됩니다.
그러나 람다 함수는 느리게 실행됩니다. 따라서 루프 외부에서 self.command 사전에 액세스하면 모든 람다 함수는 루프에서 d의 마지막 값인 동일한 d 변수를 캡처합니다. 따라서 모든 함수가 동일한 메서드를 가리키며 결과적으로 관찰된 동작이 발생합니다.
이 문제를 해결하려면 각 람다 함수가 고유한 d 값을 캡처하는지 확인해야 합니다. 한 가지 해결 방법은 d를 람다 함수에 매개 변수로 전달하고 기본값을 제공하는 것입니다.
lambda d=d: self.root.change_directory(d)
이제 람다 함수 내부의 d는 이름이 동일하더라도 매개 변수를 사용합니다. 이 매개변수의 기본값은 함수가 생성될 때 평가되어 루프의 각 반복마다 올바른 d 값에 바인딩됩니다.
또는 중첩된 클로저를 사용하여 동일한 결과를 얻을 수 있습니다.
(lambda d: lambda: self.root.change_directory(d))(d)
위 내용은 루프의 Lambda 함수가 각 반복 값 대신 마지막 값을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!