List Comprehensions: A Source of Confusing Scoping
Python 2의 List Comprehension의 한 가지 독특한 측면은 변수 범위 지정과의 특이한 상호 작용입니다. 특히 목록 이해의 루프 제어 변수는 주변 범위로 "누출"되어 잠재적인 오류와 혼란을 초래합니다.
다음 코드를 고려하세요.
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
Python 2에서 이 코드는 코드는 예기치 않게 "원래 값" 대신 4를 인쇄합니다. 이는 리스트 컴프리헨션에 사용된 루프 제어 변수 x가 컴프리헨션 외부에 정의된 x를 일시적으로 숨기기 때문입니다. 이러한 섀도잉은 이해가 완료된 후에도 지속됩니다.
이러한 동작은 미묘하고 디버그하기 어려운 오류를 유발할 수 있으므로 좌절감을 느끼게 하는 심각한 원인이 될 수 있습니다. 더욱이 이는 일반적으로 목록 이해와 관련된 편의성과 단순성을 훼손합니다.
그러나 Python 3에서는 이 동작이 해결되었습니다. 목록 이해는 더 이상 루프 제어 변수를 주변 범위로 유출하지 않습니다. 이는 항상 이런 방식으로 동작했던 생성기 표현식과 일치하게 합니다.
Python의 창시자인 Guido van Rossum에 따르면, 목록 내포의 원래 누출된 구현은 최적화를 위해 만들어진 "의도적인 절충"이었습니다. 그들의 성과. 그러나 Python 3에서는 성능 향상으로 인해 이러한 절충안이 불필요한 것으로 간주되었습니다.
Python 3에서 이러한 누수 동작이 제거되면서 목록 이해의 신뢰성과 일관성이 크게 향상되었습니다. 의도하지 않은 변수 섀도잉 가능성을 제거함으로써 이제 프로그래머는 더욱 안심하고 사용할 수 있습니다.
위 내용은 Python 2의 List Comprehension 범위가 Python 3과 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!