Python Lambda 함수의 클로저 이해
원래 질문: 인덱스 인쇄를 사용한 Lambda 클로저 퍼즐
프로그래밍에서 클로저는 바깥쪽 함수가 반환된 후에도 바깥쪽 함수의 변수를 캡처하는 내부 함수를 나타냅니다. 이를 통해 내부 함수가 변수에 대한 액세스를 유지하여 클로저 수명 동안 변수가 지속되도록 할 수 있습니다.
람다 표현식의 일반적인 사용 사례는 변수를 함수에 바인딩하는 것입니다. 그러나 제공된 예제 코드와 같이 루프 내에서 사용되는 경우 람다 함수는 클로저로 인해 예기치 않은 동작을 나타낼 수 있습니다.
코드 설명
주어진 코드에서, 루프 내에 5개의 버튼이 생성됩니다. 각 버튼에는 makeId() 함수를 호출하고 인덱스 i를 인쇄하는 람다 함수가 할당됩니다. 그러나 사용자가 아무 버튼이나 클릭하면 makeId() 함수는 항상 루프에 있는 i의 최종 값인 5를 인쇄합니다.
문제 및 해결 방법
이 문제는 람다 표현식이 실행될 때 변수 i를 당시의 값으로 확인하기 때문에 발생합니다. 그때까지 루프가 이미 종료되었으므로 i는 최종 값인 5로 확인됩니다.
이 문제를 해결하려면 람다 매개 변수를 사용하여 i의 올바른 값을 명시적으로 지정하도록 람다 식을 수정해야 합니다. . 기본적으로 람다는 바깥쪽 범위의 변수를 사용하지만 매개변수를 지정하면 원하는 값을 가진 로컬 변수가 람다 내에 생성됩니다.
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
이 수정을 통해 각 버튼의 람다 함수가 올바른 값을 캡처합니다. 루프에서 i를 가져오면 makeId() 함수가 의도한 인덱스를 올바르게 인쇄할 수 있습니다.
추가 참고
람다 매개변수는 동일할 필요가 없습니다. 둘러싸는 변수로 이름을 지정합니다. 임의의 이름을 가질 수 있으므로 람다 범위 내에서 올바른 값이 캡처됩니다.
위 내용은 루프의 Lambda 함수가 루프 반복 값 대신 최종 인덱스 값을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!