클로저를 사용하여 함수 서명에서 변수를 제거하려고 하면 예기치 않은 동작이 발생할 수 있습니다. 특히, 다른 함수 내에 포함되지 않은 람다 함수는 모든 인스턴스에 대한 변수의 마지막 값을 반환합니다.
이 동작을 이해하려면 클로저가 값이 아닌 이름을 캡처한다는 점을 인식하는 것이 중요합니다. 람다를 람다 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!