Python Lambda 함수 및 지역 변수 바인딩
Python 람다 함수로 작업할 때는 내부 변수에 대한 참조와 관련된 동작을 이해하는 것이 중요합니다. 정의된 범위. 다음 코드는 이 문제를 보여줍니다.
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
이 시나리오에서는 콘솔에 0과 1이 인쇄될 것으로 예상됩니다. 그러나 실제 출력에서는 1이 두 번 인쇄됩니다. 이 동작은 Python 람다가 로컬 변수에 바인딩하는 방식에서 비롯됩니다.
The Gotcha: Early Binding
Python 람다는 로컬 변수의 참조에 바인딩하지 않습니다. 생성됩니다. 대신 특정 시점의 변수 값에 바인딩됩니다. 결과적으로 람다가 호출되면 생성 당시 사용 가능한 값이 아닌 변수의 현재 값에 액세스합니다.
해결책: 기본 인수를 사용한 후기 바인딩
지역 변수를 람다 함수에 바인딩하고 올바른 참조를 유지하려면 후기 바인딩을 사용할 수 있습니다. 이는 아래와 같이 기본 인수를 람다 함수에 전달하여 달성됩니다.
<code class="python">x.append(lambda v=v: pv(v))</code>
이 변경으로 람다는 호출될 때가 아니라 람다가 생성될 때 v 값에 바인딩됩니다. 따라서 목록 x를 반복하고 각 람다 함수를 호출하면 예상되는 0과 1의 출력을 얻게 됩니다.
초기 바인딩 이해
추가 내용 이 개념을 명확히 하고 다음 예를 고려하십시오.
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
이 코드 조각은 "foo가 정의된 후"를 콘솔에 인쇄하여 변수가 생성이 아닌 함수 호출 시 바인딩된다는 것을 보여줍니다.
위 내용은 Python Lambda가 참조가 아닌 지역 변수\' 값에 바인딩되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!