>백엔드 개발 >파이썬 튜토리얼 >Python 2.7에서 불변 문자열 ID가 변경된 것처럼 보이는 이유는 무엇입니까?

Python 2.7에서 불변 문자열 ID가 변경된 것처럼 보이는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-23 16:22:18311검색

Why Do Immutable String IDs Appear to Change in Python 2.7?

불변 문자열의 ID가 변경되는 이유는 무엇입니까?

Python 2.7에서 문자열 ID의 동작은 혼란스러울 수 있습니다. 문자열은 변경할 수 없지만 ID는 시간이 지남에 따라 변경되는 것 같습니다. 이 문서에서는 이러한 동작의 이유를 살펴봅니다.

Python의 Id Interning

CPython은 기본적으로 모든 문자열을 인턴하지 않습니다. 그러나 특정 기준을 충족하는 문자열은 sys.intern() 함수 또는 PyCode_New 함수의 intern_string_constants() 호출을 사용하여 인턴될 수 있습니다. Internment는 코드베이스에서 동일한 문자열이 여러 번 나타나는 경우 동일한 객체를 사용하도록 보장합니다.

인턴에 적합한 문자열은 다음과 같습니다.

  • 코드 객체에 저장된 상수
  • ASCII 문자, 숫자 또는 밑줄만 포함하는 문자열
  • 식별자와 식별자 모두에 할당되는 문자열 해당 값(예: so = 'so')

ID 변경

문자열이 인턴 자격을 갖추지 못한 경우 해당 ID는 계속 변경됩니다. 이는 Python이 새 문자열에 대한 메모리 위치를 자유롭게 재사용하여 동일한 리터럴에 대해 다른 ID를 생성할 수 있기 때문입니다.

인터닝 및 문자열 사용

ID의 동작은 다음과 같습니다. 문자열 사용 방법:

  • 변수 참조 없이: 변수에 할당하지 않고 id('so')를 여러 번 호출하면 인턴된 문자열 객체가 버려지기 때문에 ID가 변경될 수 있습니다.
  • 변수 참조: 할당하는 경우 문자열을 변수에 연결하는 경우(예: so = 'so'), 인턴된 문자열이 변수에 바인딩되므로 ID는 동일하게 유지됩니다. 변수.

문자열 연결

문자열 연결은 ID에도 영향을 미칩니다. 최적화 제한 내에서 연결된 문자열은 내부 문자열로 이어질 수 있으며, 결과적으로 연결된 문자열에 대해 동일한 ID가 됩니다.

결론

Python 2.7에서 변경할 수 없는 문자열의 ID는 다음과 같습니다. 인터닝 메커니즘과 메모리 재사용으로 인해 항상 동일하지는 않습니다. 이러한 요인을 이해하면 문자열 ID의 명백한 불일치를 명확히 하는 데 도움이 됩니다.

위 내용은 Python 2.7에서 불변 문자열 ID가 변경된 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.