2012-11-08 3 views
3

가능한 중복 : 나는 사전에 여러 람다 함수를두고이 파이썬 코드가
What do (lambda) function closures capture in Python?닫기 변수

:

dictfun = dict() 
for txt in ("a", "b", "c"): 
    dictfun[txt] = lambda: "function " + txt 

그 기능 단지 호출 된 인수가있는 문자열을 반환합니다.
나는 등 dictfun["b"]()에 대한 function b하고, dictfun["a"]()에 대한 function a 같은 출력을 볼 것으로 예상하지만, 이것은 내가 무엇을 얻을 :

>>> dictfun["a"]() 
'function c' 
>>> dictfun["b"]() 
'function c' 
>>> dictfun["c"]() 
'function c' 

모두가 마지막으로 설정 한 값, 즉에 txt을 평가하는 것이 나타납니다 현재 값. 한마디로, 변수는 람다에 닫히지 않습니다. 난이 작업을 수행 할 수 있습니다

>>> txt = "a" 
>>> dictfun["c"]() 
'function a' 

은 어떻게 예상 출력을 얻기 위해 람다 함수에 txt을 닫을 수 있을까?

당신은 키워드 인수에 기본 값으로 txt의 값을 설정할 수 있습니다
+2

가하는 http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture -in-python이 질문에 대답합니까? 듀플 (dupe)처럼 보입니다. – ThiefMaster

+0

@ThiefMaster : 그렇습니다. 여기서 제안한 것과 같은 방법을 사용합니다. –

+0

D' oh ... 질문이 정확히 똑같지는 않았지만 사실 내 질문에 대한 대답이있었습니다. 어쨌든 받아 들일 수있는 것은 아니며 문제는 정확한 목표에 도달하는 대신 클로저를 이해하는 것입니다. – etuardu

답변

5

:

dictfun = dict() 
for txt in ("a", "b", "c"): 
    dictfun[txt] = lambda txt=txt: "function " + txt