Python List Comprehensions의 이름 재바인딩
List Comprehensions은 Python에서 목록을 생성하는 우아한 방법을 제공합니다. 그러나 예상치 못한 동작으로 이어질 수 있는 독특한 범위 지정 의미를 나타냅니다.
다음 코드 조각을 고려하세요.
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 3에서는 위 코드가 "원래 값"을 인쇄합니다.
이 변경의 근거는 Python 창시자인 Guido van Rossum이 설명했습니다.
"Python에서 2, 목록 이해는 루프 제어 변수를 주변 범위로 유출했습니다. 이는 의도하지 않은 일이었고 Python 3에서는 이 동작이 생성기 표현식과 일치하도록 변경되어 이름을 방지했습니다. 섀도잉."
이러한 변경으로 Python 코드의 견고성이 향상되지만 Python 2와 3 간의 동작 차이를 인식하는 것이 중요합니다. 이해에서 루프 제어 변수 앞에 밑줄을 붙이는 것과 같은 적절한 캡슐화 기술은 이러한 잠재적 위험을 완화하는 데 도움을 주세요.
위 내용은 Python 2와 3의 목록 이해에서 이름 리바인딩은 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!