> 백엔드 개발 > 파이썬 튜토리얼 > 내 Python 목록 이해가 내 변수의 값을 변경하는 이유는 무엇입니까?

내 Python 목록 이해가 내 변수의 값을 변경하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-29 12:08:11
원래의
844명이 탐색했습니다.

Why Does My Python List Comprehension Change My Variable's Value?

예기치 않은 동작: 변수 범위를 변경하는 목록 이해

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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