빈 튜플, 사전, 목록이 CPython에서 메모리 주소를 공유하는 이유는 무엇이며, 이것이 가변성과 관련이 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-31 09:51:29
원래의
589명이 탐색했습니다.

Why do empty tuples, dictionaries, and lists share memory addresses in CPython, and why is this not related to mutability?

빈 튜플, 사전 및 목록이 CPython에서 메모리 주소를 공유하는 이유는 무엇입니까?

CPython에서 빈 컨테이너(튜플, 사전 및 목록) 목록)은 개체 식별자와 관련하여 독특한 동작을 나타냅니다. 구체적으로 ()와 같은 빈 튜플과 {}와 같은 빈 사전은 동일한 메모리 주소를 가지며, []와 같은 빈 리스트도 공통 주소를 공유합니다.

설명

CPython에서 id({}) 또는 id([])가 호출되면 임시 컨테이너가 생성되어 id 함수에 전달됩니다. 그러나 함수가 이 임시 컨테이너를 처리하기 전에 해당 메모리 주소가 기록되어 전달됩니다. 그런 다음 임시 컨테이너는 삭제되고 메모리 주소만 남깁니다.

따라서 다른 컨테이너가 생성되기 전에 id({}) 또는 id([])에 대한 또 다른 호출이 이루어지면 동일한 메모리 주소 새로운 임시 컨테이너에 할당될 가능성이 높습니다. CPython의 메모리 할당자는 종종 메모리 블록을 연속적으로 할당하므로 이 시나리오의 가능성이 매우 높습니다.

'id' 함수는 객체 식별을 위해 메모리 주소에 의존하므로 id({}) == id({})가 됩니다. 그리고 id([]) == id([])는 참입니다. 이 동작은 빈 컨테이너가 일시적으로 존재하는 동안에만 발생하며 컨테이너가 고유 속성을 공유한다는 의미는 아닙니다.

변경 가능성과의 구별

변경 가능성은 직접적인 속성이 아닙니다. 이 현상의 요인. 그러나 목록과 같은 변경 가능한 개체는 튜플 및 문자열과 같은 변경 불가능한 개체처럼 캐시하거나 재사용할 수 없다는 점에 유의하는 것이 중요합니다. 결과적으로 두 개의 서로 다른 변경 가능한 객체에 대한 id(x) != id(y)는 동일한 요소를 포함하더라도 마찬가지입니다.

의미

객체의 ID는 평생 동안 독특합니다. 객체가 파괴된 후 또는 생성되기 전에 다른 객체가 동일한 ID를 획득할 수 있습니다.

위 내용은 빈 튜플, 사전, 목록이 CPython에서 메모리 주소를 공유하는 이유는 무엇이며, 이것이 가변성과 관련이 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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