В python, когда мы присваиваем значение имени, мы фактически создаем объект и ссылку на него. Например, в, объект со значением ” 1 “создается в памяти, и ссылка “a” теперь указывает на него. Поскольку я переключился на python после программирования на C в течение некоторого времени, я думал, что если я добавлю еще один оператор присваивания в тот же код (сохраняя значение неизменным), то есть будет создан новый объект и новая ссылка ” b ” будет указывать на него. Но я ошибался. Это заставило меня начать смотреть на то, что означает подсчет ссылок и как он работает в Python. Давайте рассмотрим следующий пример кода и то, как он выполняется:
a=1 b=1 c=2
Для первого оператора, как мы договорились выше, объект в памяти инициализируется значением 1. К нему добавляется ссылка “a”, и количество ссылок увеличивается на “1”. Когда Python выполняет следующий оператор, поскольку он имеет то же значение (1), новый объект не инициализируется. Тот же объект в памяти со значением 1 просто имеет еще одну ссылку “b”, добавленную к нему. Это часть процесса управления памятью Python. Например, новый объект снова создается, так как он имеет новое значение 2 с c в качестве ссылки, указывающей на него.
Мы можем проверить количество ссылок на каждый объект в python, импортировав модуль библиотеки python-sys и обратившись к его функции getrefcount.
import sys print sys.getrefcount(a)
Мы также можем лучше понять это, обратившись к адресам памяти, связанным с этими значениями, с помощью модуля id: a, b относятся к одному и тому же адресу в памяти, а c относится к другому адресу. Следующий код был выполнен с использованием python:
In [1]: a=1 In [2]: b=1 In [3]: id(a) Out[3]: 38127544 In [4]: id(b) Out[4]: 38127544 In [5]: c=2 In [6]: id(c) Out[6]: 38127520
Вот как это выглядит интересно в списках.
L = [1,1,1,1] 41596856 >>>id(L[0]) 41596856 >>>id(L[1]) 41596856 >>>id(L[2]) 41596856 >>>id(L[3]) 41596856
Все элементы списка ссылаются только на один адрес, содержащий значение 1.