List Comprehension 및 이름 재바인딩
List Comprehension은 Python에서 목록을 생성하기 위한 간결한 구문입니다. 그러나 범위 지정과 상호 작용할 때 예상치 못한 동작을 나타냅니다.
다음 코드를 고려하세요.
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
이 예에서 목록 이해는 변수 x를 반복의 현재 값에 다시 바인딩합니다. 범위(5). 이 동작을 이름 리바인딩이라고 합니다.
이름 리바인딩의 이유
Python 2에서는 목록 이해가 생성기 표현식과 다르게 구현되었습니다. 루프 제어 변수를 주변 범위로 유출하여 목록 이해가 속도에 최적화되었습니다. 반면 제너레이터 표현식은 별도의 실행 프레임을 사용하여 이러한 유출을 방지했습니다.
Python 3의 변경
Python 3에서는 이러한 구분이 제거되었습니다. 이제 목록 이해는 생성기 표현식과 동일한 구현을 사용합니다. 결과적으로 Python 3에서는 이름 재바인딩이 더 이상 발생하지 않습니다.
결과
이름 재바인딩은 특히 동일한 변수 이름이 있는 경우 예기치 않은 동작과 오류로 이어질 수 있습니다. 목록 이해와 주변 범위 모두에서 사용됩니다. 질문에서 언급했듯이 리스트 컴프리헨션의 임시 변수에 밑줄 접두사를 사용하면 이를 완화할 수 있습니다.
Python의 창시자인 Guido van Rossum은 이러한 변경의 배경에 대해 다음과 같이 설명했습니다. Python 2에서는 리스트 컴프리헨션이 유출되었습니다. 성능을 최적화하기 위해 초기 구현의 아티팩트로 루프 제어 변수를 사용합니다. 그러나 Python 3에서는 이는 생성기 표현식과 동일한 구현 전략을 채택하여 수정해야 하는 더러운 작은 비밀로 간주되었습니다.
위 내용은 Python 2의 List Comprehension이 변수를 다시 바인딩하는 이유는 무엇이며 Python 3에서는 이를 어떻게 변경했습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!