Lambda 함수 및 해당 매개변수의 범위
Python에서 람다 함수는 인라인 함수 정의를 위한 약칭 표기법을 제공합니다. 그러나 해당 범위 및 매개변수 처리로 인해 다음 코드에서 알 수 있듯이 예기치 않은 동작이 발생할 수 있습니다.
def callback(msg): print msg # Iterative Approach funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) for f in funcList: f() # Individual Creation funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) for f in funcList: f()
예상 출력은 다음과 같습니다.
do re mi do re mi
그러나 실제 출력은 다음과 같습니다.
mi mi mi do re mi
이 동작은 람다 함수가 바깥쪽 범위에서 변수 복사본을 생성하지 않는다는 사실에서 비롯됩니다. 대신 해당 변수에 대한 참조를 유지합니다. 결과적으로 루프에서 m 값을 변경하면 해당 루프 내에서 생성된 모든 람다 함수에 영향을 미칩니다.
이 문제를 해결하려면 람다 함수 생성 시 m 값을 캡처하는 것이 일반적입니다. 선택적 매개변수의 기본 인수로 사용:
for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))
이렇게 하면 각 람다 함수가 m의 올바른 값을 캡처하여 원하는 출력을 얻을 수 있습니다.
do re mi do re mi
위 내용은 Lambda 함수의 범위가 Python의 출력에 영향을 미치는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!