Переменные и их значения в Python

В Python, когда мы присваиваем значение переменной, мы создаём объект в памяти и ссылку на него. Например, конструкция a=1, создаёт в памяти объект "1" и переменная a хранит ссылку на этот объект. В отличии от большинства других языков программирования при выполнении b=1 в памяти не будет создан новый объект со значением "1", вместо этого переменная будет хранить в себе ссылку на тот же объект в памяти, который был создан при выполнении a=1

a=1 
b=1 
c=2

Первая строка в коде выше создаёт в памяти объект со значением "1" и переменная a ссылается на данный объект, при том счетчик ссылок объекта "1" становится равным 1 (единице). При выполнении второй строки (b=1) в памяти не создаётся новый объект со значением "1", вместо этого переменная b начинает ссылаться на тот же объект со значением "1", а счетчик ссылок этого объекта становится равным 2, что означает, что на данный объект ссылаются 2 переменные. Это одна из "фишек" Python, которая позволяет экономно расходовать память. При выполнении третьей операции присваивания (c=2) уже создается новый объект. 

Чтобы проверить количество ссылающихся переменных на значение мы можем при помощи следующего кода:

import sys
print(sys.getrefcount(a))

Есть и более наглядный способ. Мы можем получить адрес объекта в памяти, на который ссылается переменная, при помощи id:

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

Ещё более интересно обстоит ситуация со списками:

>>>lst = [1,1,1,1]

>>>id(lst[0])
41596856

>>>id(lst[1])
41596856

>>>id(lst[2])
41596856

>>>id(lst[3])
41596856

Все элементы приведённого списка ссылаются на один и тот же объект в памяти.

Стоит отметить, что до тех пор, пока на объект в памяти ссылается хоть одна переменная - он хранится в памяти. При достижении счетчика ссылок значения равного нулю объект из памяти удаляется. Это один из базовых механизмов Python, связанных с garbage collection.

Безусловно приведённая здесь информация не являются исчерпывающей в отношении того как Python работает с памятью, однако она показывает основные моменты и может быть полезна для новчиков.

Содержание: