2014-11-15 2 views
0

그래서 이전의 특정 부분에 작동하지, 내가 선을귀속 내 프로그램에

l.bind("<Button-1>",lambda e: getSide(i)) 

를 사용하고 내가 요소를 클릭하면, 그것을 잘 작동합니다.

그러나, 나중에 나는 다른 로컬 개체에 대한 라인

l.bind("<Button-1>",lambda e: sortby(x)) 

를 사용합니다. getSide은 바인딩 할 때 i의 값을 인쇄하는 스텁입니다. sortby은 (디버깅을 목적으로) x 값을 처음에 인쇄하는 Quicksort입니다. 궁금한 점은 getSide이 올바른 값인 sortby을 반환한다는 것입니다.

getSide 반환 i, sortby 반면 인쇄 len(column)-1, 즉 마지막 라벨은 바인딩합니다.

+0

더 많은 코드를 체크인 할 때 코드 링크가 곧 만료 될 수 있습니다. 그것은 미래에이 질문을 이해하는 것을 불가능하게 할 것입니다. github의 코드에 링크하려면 매우 구체적인 개정판에 링크해야합니다. –

+0

iCodez가 답변을 제공 했으므로 괜찮습니다. – HX6

+1

우리가 질문과 답변을 시간의 테스트에 서기를 원하기 때문에 다른 사람들이 집단 지식으로부터 이익을 얻을 수 있기 때문에 정말로 괜찮은 것은 아닙니다. –

답변

2

문제는 루프 내에서 이러한 바인딩을 생성한다는 것입니다.

람다 함수 안에 포함 된식이 호출시에 평가되기 때문이다
for x in range(0,len(columns)): 
... 
    l.bind("<Button-1>",lambda e, x=x: sortby(x)) 
#         ^^^ 

, 정의 -하지 :이 작업을 수행 할 때, 당신은 어떤 값이 인수 목록에서 람다 함수 내에서 사용 "캡처"해야한다 시각. 따라서 xsortby(x)은 항상 루프의 x이 보유한 마지막 값을 나타냅니다.

그러나 기본 인수는 정의 시간에 평가됩니다. 따라서 x=x을 수행하면 x이 루프 내부의 x의 현재 값을 참조합니다.

+0

이 문제가 해결 되었음이 확인되었습니다. 좋은 작업! 나는이 하나에 완전히 난처했다. – twasbrillig

+0

정말 비열한 오류입니다. 일반적으로 선호하는 것은 람다 대신 짧은 함수를 정의하는 것입니다. – twasbrillig

+0

모든 이전 상황에서 작동했을 때 이상한 일 이었지만 특정 상황에서는 작동하지 않았습니다. 나는 이것을 장래를 위해 기억할 것이다. – HX6

관련 문제