CPython의 id() 함수는 객체에 고유 식별자를 할당하지만 이 고유성은 객체의 수명으로 제한됩니다. 객체가 삭제되면 해당 식별자를 재사용할 수 있게 됩니다.
다음 동작을 고려하세요.
<code class="python">tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # makes sense, tuples are immutable assert(id(tuple1) == id(tuple2)) # also makes sense dicts are mutable assert(id(dict1) != id(dict2)) # lists are mutable too assert(id(list1) != id(list2)) assert(id(()) == id(())) # why no assertion error on this? assert(id({}) == id({})) # or this? assert(id([]) == id([]))</code>
id({}) == id({}) 및 id([ ]) == id([]) return True?
CPython의 메모리 할당
이러한 어설션은 CPython의 메모리 할당 메커니즘으로 인해 성공합니다. id({})일 때 CPython은 사전을 할당하고 해당 메모리 주소를 id()에 전달한 다음 사전을 삭제합니다. 다시 호출되면 CPython은 사용 가능한 메모리 블록을 찾아 동일한 주소를 재사용합니다. 가변성은 이 동작에 직접적인 영향을 미치지 않습니다.
코드 객체 캐싱
코드 객체는 특정 함수, 클래스 또는 모듈 내에서 사용되는 튜플과 문자열을 캐시합니다. 동일한 리터럴(정수, 문자열 또는 특정 튜플)이 여러 번 나타나는 경우 동일한 객체가 재사용됩니다. 변경 가능한 객체는 항상 런타임에 생성되어 재사용을 방지합니다.
결론
따라서 CPython의 객체 ID는 수명 동안에만 고유합니다. 객체가 파괴되면 해당 ID는 다른 객체에서 재사용될 수 있습니다. 이는 제공된 코드 조각에서 관찰된 동작을 설명합니다.
위 내용은 CPython에서 `id({}) == id({})` 및 `id([]) == id([])`가 True를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!