Ответ 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]