Две переменные с одним и тем же списком имеют разные идентификаторы..... почему?

Попытка понять следующее

Почему идентификатор, назначенный Python, отличается для одинаковых списков?

x = [1, 2, 3]
y = [1, 2, 3]

id(x) != id(y)
True

id(x)
11428848

id(y)
12943768

Ответ 1

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

Это особенно важно понять для изменяемых объектов - то есть объектов, которые можно изменить, например, списки. Если объект можно изменить, вы можете создать два разных объекта с одним и тем же содержимым. У них будут разные идентификаторы, и если вы измените их позже, второй не изменится.

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

Этот набор идей довольно глубокий. Вы можете придумать имя переменной как тэг, назначенный идентификационному номеру, который, в свою очередь, однозначно идентифицирует объект. Для тегов одного и того же объекта можно использовать несколько имен переменных. Обратите внимание:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
4532949432
>>> id(b)
4533024888

Это вы уже обнаружили. Теперь давайте создадим новое имя переменной:

>>> c = b
>>> id(c)
4533024888

Новый объект не создан. Объект с тегом b теперь помечен тегом c. Что происходит, когда мы меняем a?

>>> a[1] = 1000
>>> a
[1, 1000, 3]
>>> b
[1, 2, 3]

a и b отличаются, как известно, потому что у них разные идентификаторы. Таким образом, изменение одного не влияет на другое. Но b и c - это один и тот же объект - помните? Так что...

>>> b[1] = 2000
>>> b
[1, 2000, 3]
>>> c
[1, 2000, 3]

Теперь, если я назначу новое значение b, это ничего не меняет об объектах - именно так, как они помечены:

>>> b = a
>>> a
[1, 1000, 3]
>>> b
[1, 1000, 3]
>>> c
[1, 2000, 3]

Ответ 2

Почему к тому, что если вы это сделаете:

l = [1, 2, 3]
m = [1, 2, 3]
l.append(4)

Идентификаторы не должны быть одинаковыми, и идентификаторы не должны меняться для каких-либо объектов, поскольку они идентифицируют их. Все изменчивые объекты работают таким образом. Но это также относится к кортежам (которые не поддаются сомнению).

Изменить: Как указано ниже, идентификаторы могут ссылаться на адрес памяти в некоторой реализации python, но не во всех.

Ответ 3

Это не те же списки. Они могут содержать идентичную информацию, но они не совпадают. Если вы сделали y = x, вы обнаружите, что на самом деле id одинаковый.

Ответ 4

Python поддерживает переменные переменные с разными идентификаторами, поэтому.

Вы можете проверить его с неизменяемым объектом id; например, кортеж.