>백엔드 개발 >파이썬 튜토리얼 >Python Lambda가 참조가 아닌 지역 변수\' 값에 바인딩되는 이유는 무엇입니까?

Python Lambda가 참조가 아닌 지역 변수\' 값에 바인딩되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-28 06:37:021115검색

 Why do Python Lambdas Bind to Local Variables' Values, Not References?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:CS 주간 ython다음 기사:CS 주간 ython