예기치 않은 동작: 변수 범위를 변경하는 목록 이해
Python 목록 이해는 데이터 조작을 위한 강력한 도구이지만 숨겨진 기발한 점이 있습니다. 예상치 못한 일로 이어질 수 있다 동작.
문제
Python 2(및 이전 버전)에서 목록 이해는 루프 제어 변수를 루프의 마지막 값으로 "다시 바인딩"할 수 있습니다. 이해의 범위가 끝났습니다. 이로 인해 놀라운 동작이 발생할 수 있습니다.
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
이 예에서는 루프 제어 변수 x가 목록 이해 내에서 루프(4)의 마지막 값에 다시 할당됩니다. 이는 print(x)가 컴프리헨션 외부에서 호출되면 "원래 값" 대신 4를 인쇄한다는 의미입니다.
설명
위에 설명된 동작은 결과입니다. 목록 이해가 Python 2에서 처음 구현된 방식입니다. 목록 이해를 최대한 효율적으로 만들기 위해 루프 제어 변수가 주변으로 유출되었습니다. 범위.
Python 3 수정
Python 3에서는 이 동작이 변경되었습니다. 목록 이해는 더 이상 이해 외부의 루프 제어 변수를 다시 바인딩하지 않습니다. 이는 루프 제어 변수를 다시 바인딩하지 않는 목록 이해와 생성기 표현식 간의 일관성을 개선하기 위해 수행되었습니다.
Guido van Rossum의 설명
Guido van Rossum, 작성자 Python 3의 이러한 변경 이유를 다음과 같이 설명했습니다.
"우리는 "더러운 작은 문제"를 수정하기로 결정했습니다. 생성기 표현식과 동일한 구현 전략을 사용하여 목록 내포의 비밀"을 생성합니다. 따라서 Python 3에서 위의 예는... 'before'를 인쇄하여 목록 내포의 'x'가 일시적으로 그림자를 나타내지만 재정의되지는 않음을 증명합니다. 주변 범위의 'x'."
결론
리스트 이해의 동작이 처음에는 직관에 반하는 것처럼 보일 수 있으므로 Python 2와 Python 3 모두에서 어떻게 작동하는지 이해하는 것이 중요합니다. 이러한 지식은 잠재적인 버그를 방지하고 보다 강력한 코드를 작성하는 데 도움이 됩니다.
위 내용은 내 Python 목록 이해가 내 변수의 값을 변경하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!