>  기사  >  백엔드 개발  >  Python에서 예기치 않은 Lambda 폐쇄 동작의 원인은 무엇입니까?

Python에서 예기치 않은 Lambda 폐쇄 동작의 원인은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-21 13:10:30887검색

What Causes Unexpected Lambda Closure Behavior in Python?

Python Lambda 클로저 범위 지정

Python에서 람다 클로저의 동작을 이해하는 것은 까다로울 수 있습니다. 이 기사에서는 람다 함수가 예기치 않게 동작하여 모든 경우에 대해 동일한 값을 반환하는 사례를 살펴봅니다.

문제:

다음 코드를 고려하세요.

<code class="python">names = ['a', 'b', 'c']

def test_fun(name, x):
    print(name, x)

def gen_clousure(name):
    return lambda x: test_fun(name, x)

funcs1 = [gen_clousure(n) for n in names]
funcs2 = [lambda x: test_fun(n, x) for n in names]</code>

funcs1에서 함수를 호출하면 예상한 결과를 얻습니다.

a 1
b 1
c 1

그러나 funcs2에서 함수를 호출하면 예상치 못한 결과가 나타납니다.

c 1
c 1
c 1

예상되는 출력은 첫 번째 경우와 동일해야 하지만 대신 모든 경우에 대해 성 'c' 값이 표시됩니다.

설명:

이 동작을 이해하는 열쇠는 클로저의 개념에 있습니다. Python의 클로저는 내부 함수가 바깥쪽 범위의 변수에 액세스할 수 있도록 허용합니다. 첫 번째 경우(funcs1)에서는 람다 함수가 루프 내부에 생성되지만 둘러싸는 범위에서 변수 이름을 캡처하여 이를 람다 함수 내의 이름에 바인딩합니다.

두 번째 경우(funcs2 ) 그러나 람다 함수는 람다 함수 내의 이름에 바인딩하지 않고 바깥쪽 범위에서 변수 n을 직접 참조합니다. 즉, 람다 함수가 호출되면 해당 시점에 n을 평가하는데, 이는 항상 루프에서 마지막 값을 반환하므로 예상치 못한 출력이 발생합니다.

문제 방지:

이 문제를 방지하고 원하는 동작을 달성하려면 람다 함수가 바깥쪽 범위에서 변수를 캡처하고 이를 람다 함수 내의 이름에 바인딩하는지 확인해야 합니다. 이를 수행하는 한 가지 방법은 람다 함수를 다른 함수로 래핑하는 것입니다.

<code class="python">def makeFunc(n):
    return lambda x: x+n</code>

makeFunc의 결과 람다 함수는 바깥쪽 범위에서 n 값을 캡처하여 람다 함수 내의 이름에 바인딩합니다. 원하는 행동을 달성합니다.

위 내용은 Python에서 예기치 않은 Lambda 폐쇄 동작의 원인은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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