복붙노트

[PYTHON] 파이썬 람다 문제

PYTHON

파이썬 람다 문제

무슨 일 이니? 함수 목록을 만들려고합니다.

def f(a,b):
    return a*b

funcs = []

for i in range(0,10):
    funcs.append(lambda x:f(i,x))

이것은 내가 기대하는 것을하지 않습니다. 목록이 다음과 같이 작동 할 것으로 기대합니다.

funcs[3](3) = 9
funcs[0](5) = 0

그러나 목록의 모든 기능은 동일하고 고정 값을 9로 설정해야합니다.

funcs[3](3) = 27
funcs[3](1) = 9

funcs[2](6) = 54

어떤 아이디어?

해결법

  1. ==============================

    1.람다는 파이썬에서 클로저입니다 .... 당신이주는 인자는 람다가 평가 될 때까지 평가되지 않을 것입니다. 그때, 당신의 반복이 끝났기 때문에 나는 관계없이 9입니다.

    람다는 파이썬에서 클로저입니다 .... 당신이주는 인자는 람다가 평가 될 때까지 평가되지 않을 것입니다. 그때, 당신의 반복이 끝났기 때문에 나는 관계없이 9입니다.

    찾고있는 동작은 functools.partial을 사용하여 수행 할 수 있습니다.

    import functools
    
    def f(a,b):
        return a*b
    
    funcs = []
    
    for i in range(0,10):
        funcs.append(functools.partial(f,i))
    
  2. ==============================

    2.네, 보통의 "범위 지정 문제"(실제로 바인딩 - 나중에 -보다 더 원하는 문제이지만, 종종 그 이름으로 불립니다). 이미 "가짜 기본"i = i 솔루션과 functools.partial이라는 두 가지 최상의 답변을 얻었으므로 고전적인 세 번째 "공장 람다"중 세 번째만을 제공합니다.

    네, 보통의 "범위 지정 문제"(실제로 바인딩 - 나중에 -보다 더 원하는 문제이지만, 종종 그 이름으로 불립니다). 이미 "가짜 기본"i = i 솔루션과 functools.partial이라는 두 가지 최상의 답변을 얻었으므로 고전적인 세 번째 "공장 람다"중 세 번째만을 제공합니다.

    for i in range(0,10):
        funcs.append((lambda i: lambda x: f(i, x))(i))
    

    개인적으로 funcs 함수의 위험이 우연히 1 대신 2 개의 매개 변수로 호출되는 경우 i = i를 사용합니다. 그러나 함수 함수 접근법은 여러분이 단지 사전 바인딩보다 더 풍부한 것을 필요로 할 때 고려할 가치가 있습니다 하나의 주장.

  3. ==============================

    3.당신이 생각하는 것과는 반대로, 각각의 람다에 묶여있는 것은 오직 하나뿐입니다. 이것은 흔한 실수입니다.

    당신이 생각하는 것과는 반대로, 각각의 람다에 묶여있는 것은 오직 하나뿐입니다. 이것은 흔한 실수입니다.

    원하는 것을 얻는 한 가지 방법은 다음과 같습니다.

    for i in range(0,10):
        funcs.append(lambda x, i=i: f(i, x))
    

    이제 각 람다 클로저에 기본 매개 변수 i를 만들고 루프 변수 i의 현재 값을 바인딩합니다.

  4. ==============================

    4.모든 람다는 결국 마지막 끈에 묶여있게된다. 더 긴 대답은이 질문을보십시오.

    모든 람다는 결국 마지막 끈에 묶여있게된다. 더 긴 대답은이 질문을보십시오.

    리스트 컴파일 (for comprehension / for loop)에서 파이썬 람다 목록을 어떻게 만듭니 까?

  5. ==============================

    5.i == 9의 최종 값 고려

    i == 9의 최종 값 고려

    어떤 좋은 파이썬 함수와 마찬가지로 정의 된 범위에서 변수의 값을 사용할 것입니다. 아마 lambda : varname (그것이 언어 구조 임)은 값이 아닌 이름에 바인딩하고 런타임에 해당 이름을 평가합니까?

    비슷하다:

    i = 9
    def foo():
        print i
    
    i = 10
    foo()
    

    나는 내 대답이 정확한지에 대해 관심이있을 것이다.

  6. from https://stackoverflow.com/questions/1107210/python-lambda-problems by cc-by-sa and MIT license