>백엔드 개발 >파이썬 튜토리얼 >루프의 Lambda 함수가 각 반복 값 대신 마지막 값을 캡처하는 이유는 무엇입니까?

루프의 Lambda 함수가 각 반복 값 대신 마지막 값을 캡처하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-21 07:52:10423검색

Why Do Lambda Functions in Loops Capture the Last Value Instead of Each Iteration's Value?

Lambda in a Loop

다음 코드 조각을 고려하세요.

# 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.