>  기사  >  백엔드 개발  >  Lambda 클로저가 값 대신 이름을 캡처하는 이유는 무엇입니까?

Lambda 클로저가 값 대신 이름을 캡처하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-21 13:15:30787검색

Why Do Lambda Closures Capture Names Instead of Values?

Python Lambda 클로저 범위 지정

클로저를 사용하여 함수 서명에서 변수를 제거하려고 하면 예기치 않은 동작이 발생할 수 있습니다. 특히, 다른 함수 내에 포함되지 않은 람다 함수는 모든 인스턴스에 대한 변수의 마지막 값을 반환합니다.

이 동작을 이해하려면 클로저가 값이 아닌 이름을 캡처한다는 점을 인식하는 것이 중요합니다. 람다를 람다 x: test_fun(n, x)으로 정의하면 n 변수는 함수 내에서 평가되지 않고 호출 시 평가됩니다. 결과적으로 가정하는 값은 루프의 마지막 값입니다.

클로저를 사용하여 변수를 효과적으로 "제거"하려면 변수를 함수에 인수로 전달해야 합니다. 이는 변수의 현재 값을 함수에 할당하고 효과적으로 "잠금"시킵니다. 예를 들면 다음과 같습니다.

<code class="python">stuff = [lambda x: n+x for n in [1, 2, 3]]  # Bad, captured value is last value
stuff = [lambda x, n=n: n+x for n in [1, 2, 3]]  # Good, n is locked in</code>

또는 두 개의 중첩 함수를 사용할 수 있습니다.

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

stuff = [makeFunc(n) for n in [1, 2, 3]]</code>

여기에서 makeFunc 내의 람다는 전역 변수가 아닌 로컬 n 변수를 캡처합니다. 각 makeFunc 호출은 새로운 지역 변수를 생성하여 반환된 람다 함수가 고유한 n 값을 갖도록 보장합니다.

결국 단순성과 유연성 사이의 선택은 귀하의 몫입니다. 반환된 함수에 추가 인수를 사용하여 더 간단한 함수 생성을 선택하거나 두 개의 중첩 함수가 포함된 더 복잡한 함수 생성 프로세스를 사용하여 더 깔끔한 함수를 선택할 수 있습니다.

위 내용은 Lambda 클로저가 값 대신 이름을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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