2010-08-07 6 views
39

루프 내부에서 함수를 만들고 사전에 저장하려고합니다. 문제는 사전의 모든 항목이 마지막으로 생성 된 기능에 매핑되는 것으로 보입니다. 코드는 다음과 같이 진행됩니다루프에서 함수 만들기

d = {} 
def test(**kwargs): 
    for k in kwargs: 
     def f(): 
      print k, kwargs[k] 
     d[k] = f 
     f() 

test(foo=1, bar=2) 
print 'should print the same output as before' 
d['foo']() 
d['bar']() 

이 출력 : 왜

foo 1 
bar 2 
should print the same output as before 
bar 2 
bar 2 

어떤 생각?

+1

: http://docs.python-guide.org/ko/latest/writing/gotchas/#late-binding-closures –

답변

82

하는 당신은 늦게 바인딩에 문제로 실행중인 - 각 기능이 가능한 늦게 k을 보이는 것은 (test 외부에서 호출 할 때 따라서,이 루프의 종료 후 발생).

가 쉽게 초기 바인딩을 강제로 고정 : 변화 def f():def f(k=k):에 - 디폴트 값을 올려다 보았다된다 (오른쪽 kk=k에서 것은 k=k에서 왼쪽 k이다 인수 이름 k 대한 기본값입니다) def 시간이 아니라 call 시간이므로 본질적으로 초기 바인딩을 구체적으로 찾는 방법입니다.

def make_f(kwargs, k): 
    def f(): 
     print k, kwargs[k] 
    return f 

과의 : 당신이 f 여분의 인수를 받고 (따라서 잠재적으로 잘못 호출되는)에 대한 걱정이 있다면

는 "기능 공장"으로 클로저를 사용하여 관련된보다 정교한 방법이 루프는 def 문 대신 f = make_f(kwargs, k)을 사용하십시오.

관련 문제