>백엔드 개발 >파이썬 튜토리얼 >내 버튼의 명령이 Lambda를 사용하는 루프에서 항상 동일한 인덱스를 인쇄하는 이유는 무엇입니까?

내 버튼의 명령이 Lambda를 사용하는 루프에서 항상 동일한 인덱스를 인쇄하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 03:54:27902검색

 Why Does My Button's Command Always Print the Same Index in a Loop with a Lambda?

람다의 클로저 이해: 변수 해결

이 상황에서는 루프 내에 여러 버튼을 생성하려고 합니다. 특정 인덱스 값을 인쇄하는 명령을 트리거하는 버튼입니다. 그러나 버튼의 명령이 항상 동일한 인덱스 "5"를 인쇄하는 문제가 발생합니다.

이 동작은 람다의 클로저 특성에서 비롯됩니다. 람다가 정의되면 바깥쪽 범위의 변수를 캡처하고 실행 시 이를 참조합니다. 귀하의 경우, 둘러싸는 범위는 변수 i가 현재 인덱스를 나타내는 루프입니다.

안타깝게도 람다가 실행될 때(버튼을 누를 때) i 값은 이미 마지막 인덱스에 도달했습니다. 반복되며 모든 버튼에 대해 "5"와 같습니다. 이는 캡처된 변수 i가 동일한 메모리 위치에 대한 참조이고 보유하는 값이 루프가 진행됨에 따라 업데이트되기 때문입니다.

이 문제를 해결하려면 올바른 값을 캡처하는 클로저를 생성해야 합니다. 각 버튼에 대한 i의. 람다 함수에서 i 매개변수에 대한 기본값을 제공하여 이를 수행할 수 있습니다. 예:

<code class="python">make_button = Tkinter.Button(frame, text="make!",
                              command=lambda i=i: makeId(i))</code>

i=i를 람다 매개변수의 기본값으로 제공하면 각 버튼에 대해 올바른 인덱스 값을 보유하는 로컬 변수 i가 생성됩니다. 버튼을 누르면 캡처된 지역 변수 i로 람다 함수가 실행되고 올바른 인덱스가 인쇄됩니다.

위 내용은 내 버튼의 명령이 Lambda를 사용하는 루프에서 항상 동일한 인덱스를 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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