CPython에서 `id({}) == id({})` 및 `id([]) == id([])`가 True를 반환하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-10-30 04:11:03
원래의
271명이 탐색했습니다.

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

CPython의 고유 객체 식별자: id({}) == id({}) 및 id([]) == id([])인 이유

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

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