Рубрики
Без рубрики

Ссылки на переменные в Python

Ссылка на переменную в python

Автор оригинала: Arch B.

В python, когда мы присваиваем значение имени, мы фактически создаем объект и ссылку на него. Например, в, объект со значением ” 1 “создается в памяти, и ссылка “a” теперь указывает на него. Поскольку я переключился на python после программирования на C в течение некоторого времени, я думал, что если я добавлю еще один оператор присваивания в тот же код (сохраняя значение неизменным), то есть будет создан новый объект и новая ссылка ” b ” будет указывать на него. Но я ошибался. Это заставило меня начать смотреть на то, что означает подсчет ссылок и как он работает в Python. Давайте рассмотрим следующий пример кода и то, как он выполняется:

a=1 
b=1 
c=2

Для первого оператора, как мы договорились выше, объект в памяти инициализируется значением 1. К нему добавляется ссылка “a”, и количество ссылок увеличивается на “1”. Когда Python выполняет следующий оператор, поскольку он имеет то же значение (1), новый объект не инициализируется. Тот же объект в памяти со значением 1 просто имеет еще одну ссылку “b”, добавленную к нему. Это часть процесса управления памятью Python. Например, новый объект снова создается, так как он имеет новое значение 2 с c в качестве ссылки, указывающей на него.

Var ref.png

Мы можем проверить количество ссылок на каждый объект в 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.