CPython에서 서로 다른 두 객체가 동일한 객체가 아닌데도 동일한 ID를 가질 수 있는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-31 00:33:03
원래의
795명이 탐색했습니다.

Why can two distinct objects in CPython have the same ID even though they are not the same object?

CPython에서 동일한 객체 ID 이해

CPython에서 내장 함수 id()는 객체의 메모리 주소를 나타내는 고유한 정수를 반환합니다. . 흥미롭게도 다음 예에서 볼 수 있듯이 특정 상황에서는 두 개의 서로 다른 객체가 동일한 ID를 가질 수 있습니다.

<code class="python">tuple1 = ()
tuple2 = ()
dict1 = {}
dict2 = {}
list1 = []
list2 = []

# Tuples are immutable
assert(id(tuple1) == id(tuple2))

# Dicts are mutable
assert(id(dict1) != id(dict2))

# Lists are mutable too
assert(id(list1) != id(list2))

# Unexpectedly, empty dicts and lists have the same ID
assert(id({}) == id({}))
assert(id([]) == id([]))</code>
로그인 후 복사

행동 이면의 이유

이 독특한 이 현상은 CPython 메모리 할당자의 런타임 동작과 객체 생성 및 소멸을 처리하는 방식으로 인해 발생합니다. id({})가 호출되면 CPython은 새 사전 객체를 생성하고 이를 메모리의 임시 위치에 할당합니다. 그러나 이 임시 개체는 id() 함수가 해당 ID를 반환한 직후에 삭제됩니다. 다음 ID({})가 호출되면 이전 사전과 동일한 메모리 위치에 새 사전이 생성될 수 있으며, 이러한 객체가 서로 다르더라도 동일한 ID가 생성될 수 있습니다.

이러한 추론은 다음과 같습니다. 다음 순서에서 관찰된 동작에 의해 추가로 지원됩니다.

<code class="python">id([])
4330909912

x = []
id(x)
4330909912

id([])
4334243440</code>
로그인 후 복사

변경 가능성 및 캐싱의 영향

변경 가능성이 이 동작에서 간접적인 역할을 한다는 점은 주목할 가치가 있습니다. 변경 가능한 개체(예: 목록 및 사전)는 코드 개체 캐싱에 적합하지 않지만 변경 불가능한 개체(예: 빈 튜플 및 특정 문자열)에는 적합합니다. 이는 동일한 코드 객체 내에서 이러한 불변 객체가 재사용되어 잠재적으로 동일한 ID가 별개의 불변 객체에 할당된다는 것을 의미합니다.

ID 고유성 및 객체 수명

요약하면 객체의 ID는 해당 객체의 수명 동안에만 고유합니다. 객체가 파괴되거나 생성되기 전에 다른 객체에 동일한 ID가 할당될 수 있습니다. 이러한 동작은 CPython에서 개체 ID의 일시적인 특성과 기본 Python 구현의 맥락에서 메모리 할당 및 개체 생성 역학을 이해하는 것이 중요하다는 점을 강조합니다.

위 내용은 CPython에서 서로 다른 두 객체가 동일한 객체가 아닌데도 동일한 ID를 가질 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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