Python имеет имена , которые относятся к объектам . Объекты существуют отдельно от имен, а имена существуют отдельно от объектов, на которые они ссылаются.
# name a
a = 1337
# object 1337
При назначении «имени имени» правая часть равна оценивается для упомянутого объекта. Аналогично тому, как 2 + 2
оценивается как 4
, a
соответствует исходному 1337
.
# name b
b = a
# object referred to by a -> 1337
На данный момент у нас есть a -> 1337
и b -> 1337
- обратите внимание, что ни одно имя не знает другого! Если мы тестируем a is b
, оба имени оцениваются для одного и того же объекта, который, очевидно, равен.
Переназначение имени только изменяет то, к чему относится это имя - нет связи, по которой другие имена также могут быть изменены.
# name a - reassign
a = 9001
# object 9001
На данный момент у нас есть a -> 9001
и b -> 1337
. Если мы сейчас проверим a is b
, оба имени будут оценены для разных объектов, которые не совпадают.
Если вы пришли из таких языков, как C, то вы привыкли к переменным , содержащим значения. Например, char a = 12
можно прочитать как «a
- область памяти, содержащая 12
». Кроме того, вы можете иметь несколько переменных, использующих одну и ту же память. Присвоение другого значения переменной изменяет содержимое разделяемой памяти - и, следовательно, значение обеих переменных.
+- char a -+
| 12 |
+--char b -+
# a = -128
+- char a -+
| -128 |
+--char b -+
Это не то, как работает Python: имена не содержат ничего, но относятся к отдельным значениям. Например, a = 12
можно прочитать как «a
- это имя, которое относится к значению 12
». Кроме того, вы можете иметь несколько имен, ссылающихся на одно и то же значение, но это будут отдельные имена, каждое со своей ссылкой. Присвоение другого значения имени изменяет ссылку на это имя, но оставляет ссылку на другое имя нетронутой.
+- name a -+ -\
\
--> +- <12> ---+
/ | 12 |
+- name b -+ -/ +----------+
# a = -128
+- <-128> -+
+- name a -+ -----> | -128 |
+----------+
+- <12> ---+
+- name b -+ -----> | 12 |
+----------+