> 백엔드 개발 > 파이썬 튜토리얼 > Python Lambda 함수 클로저는 실제로 어떤 변수를 캡처합니까?

Python Lambda 함수 클로저는 실제로 어떤 변수를 캡처합니까?

DDD
풀어 주다: 2024-12-29 06:55:14
원래의
353명이 탐색했습니다.

What Variables Do Python Lambda Function Closures Actually Capture?

Python Lambda 함수 클로저 캡처는 무엇입니까?

Python 람다 함수 클로저로 작업할 때는 캡처 동작을 이해하는 것이 중요합니다. 클로저는 클로저 내에서 사용되는 둘러싸는 범위의 변수 값을 캡처합니다. 그러나 이 캡처가 발생하는 방식은 놀랄 수 있습니다.

이를 설명하기 위해 다음 코드를 고려하십시오.

adders = [None, None, None, None]

for i in [0, 1, 2, 3]:
    adders[i] = lambda a: i + a

print(adders[1](3))
로그인 후 복사

이 코드에서는 다음을 수행하는 람다 함수 목록을 생성합니다. 단일 입력을 입력하고 여기에 상수 값을 추가합니다. 상수 값은 함수 생성 중에 초기에 i 값으로 설정됩니다. 그러나 클로저 목록을 조사해 보면 놀랍게도 모두 i의 최종 값을 참조하여 예상치 못한 6의 출력이 발생한다는 것을 알 수 있습니다.

이 동작은 클로저가 i의 값을 캡처한다는 사실에서 비롯됩니다. 참조가 아닌 변수입니다. 결과적으로 클로저 생성 후 i 값이 변경되면 클로저는 마지막으로 캡처한 값을 계속 참조합니다.

현재 값 캡처

캡처하려면 i의 현재 값에 대해 "더미 매개변수" 기술이라는 트릭을 사용할 수 있습니다. 캡처하려는 변수와 동일한 이름의 매개변수를 선언하고 해당 변수의 기본값을 제공함으로써 클로저가 현재 값을 캡처하도록 강제합니다.

for i in [0, 1, 2, 3]:
    adders[i] = lambda a, i=i: i + a  # <-- Note the dummy parameter with a default value

print(adders[1](3))  # Output: 4
로그인 후 복사

이 기술을 사용하면 클로저는 생성 당시 i의 값을 캡처하여 나중에 i에 대한 변경이 클로저의 동작에 영향을 미치지 않도록 보장합니다.

위 내용은 Python Lambda 함수 클로저는 실제로 어떤 변수를 캡처합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿