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