0

게임을 만들고 작동 시키려면 "미리 빌드 된"또는 "준비가 된"식의 목록을 생성해야합니다. 나는 람다 표현식을 사용하여이 작업을 수행하려고하지만 조회 테이블을 생성하는 문제가 발생합니다. 내가 가진 코드는 다음과 유사합니다파이썬 람다 식 룩업 테이블 생성하기

funct_list.append(lambda: test(i, "Hello World")) 
funct_list.append(lambda: test(i, "Hello World")) 
funct_list.append(lambda: test(i, "Hello World")) 
funct_list.append(lambda: test(i, "Hello World")) 
... 

과 나는 갈 필요가 :

import inspect 

def test(*args): 
    string = "Test Function: " 
    for i in args: 
     string += str(i) + " " 
    print(string) 

funct_list = [] 

# The problem is in this for loop 
for i in range(20): 
    funct_list.append(lambda: test(i, "Hello World")) 

for i in funct_list: 
    print(inspect.getsource(i)) 

내가 얻을 출력은

funct_list.append(lambda: test(1, "Hello World")) 
funct_list.append(lambda: test(2, "Hello World")) 
funct_list.append(lambda: test(3, "Hello World")) 
funct_list.append(lambda: test(4, "Hello World")) 
... 

나는 다음의 두 시도 둘 다 작동하지 않음

for i in range(20): 
    funct_list.append(lambda: test(i, "Hello World")) 

for i in range(20): 
    x = (i, "Hello World") 
    funct_list.append(lambda: test(*x)) 

마이 큐 stion은 이미 설정 한 람다 식 내부의 변수 중 일부를 사용하여 람다 식 목록을 생성하는 방법입니다.

+2

* 파이썬의 폐쇄는 후기 바인딩 있습니다 *. http://docs.python-guide.org/en/latest/writing/gotchas/#late-binding-closures –

답변

2

다른 언급했듯이, 파이썬의 폐쇄는 늦게 폐쇄에서 참조 외부 범위에서 변수 (즉은, 닫혀 변수)가 폐쇄되는 순간에 조회됩니다 즉, 바인딩 정의시에는 이 아니고이 아닙니다.

예제에서 람다가 변수 i을 외부 범위에서 참조 할 때 문제의 클로저가 형성됩니다. 당신의 람다가 나중에 호출 될 때, 루프는 이미 완료하고 값 특히 우아한 간단하지만 수정 람다의 기본 인수를 사용하는 것입니다 (19)

와 변수 i 남겼습니다 :

for i in range(20): 
    funct_list.append(lambda x=i: test(x, "Hello World")) 

클로저 변수와 달리 기본 인수는 일찍 바인드되므로 람다 정의시 변수 i의 값을 캡처하는 원하는 효과를 얻을 수 있습니다.

더 좋은 방법은 당신이 부분적으로 기능을 일부 인수를 적용 할 수 있습니다 사용 functools.partial이고, 그 특정 값으로 "고정"

from functools import partial 

for i in range(20): 
    funct_list.append(partial(lambda x: test(x, "Hello World"), i)) 
+3

이상인 경우에는 'functools.partial' (지연 바인딩이 아닌)을 사용하면됩니다. 덜 총체 ... –

+1

어쨌든, 왜 그들이 디폴트 논쟁을 사용해야하는지 * 진술 * –

+1

나는 가고 있었지만 우연히 너무 일찍 제출했다. 나는 내 대답을 넓힐 것이다. – dkasak