Почему идентификатор списка Python не изменяется после операции добавления, если он реализован как динамический массив? - PullRequest
1 голос
/ 07 ноября 2019

Если список реализован в виде динамического массива, каждый раз, когда выделенный размер полностью занят, если для массива создается новое пространство, почему идентификатор не изменяется?

a = []

id (a) 4395087184

для i в диапазоне (1000): a.append (i)

id (a) 4395087184

1 Ответ

0 голосов
/ 07 ноября 2019

id объекта гарантированно будет постоянным в течение всего срока службы объекта. Таким образом, было бы нарушением спецификации функции id, если бы этот список id изменился, и вы создали только один список, чтобы не было двух объектов списка с разными id s.

. на практике работает то, что сам объект списка остается в той же области памяти, но он содержит (частную) ссылку на резервный массив. Когда необходимо изменить емкость массива, создается новый резервный массив и содержимое копируется. Ссылка (частная) ссылка на объект списка обновляется, чтобы указывать на новый резервный массив, но сам объект списка не был перемещен в памяти.

Я написал более подробное объяснение того, какЭто работает, в том числе интерактивный пример, который показывает диаграммы и указатели объекта списка и массива поддержки. Это может оказаться полезным для понимания того, что на самом деле происходит в памяти при изменении размера резервного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...