Комментарий к Как обойти объявление неиспользуемой переменной в цикле for? (Закончился размер комментария)
Python поддерживает ту же ссылку для созданного объекта.(независимо от изменчивости), например,
In [1]: i = 1
In [2]: j = 1
In [3]: id(i)
Out[3]: 142671248
In [4]: id(j)
Out[4]: 142671248
Вы можете видеть как i, так и j, ссылаясь на один и тот же объект в памяти. Что происходит, когда мы изменяем значение одной неизменяемой переменной.
In [5]: j = j+1
In [6]: id(i)
Out[6]: 142671248
In [7]: id(j)
Out[7]: 142671236
Вы можете видеть, что j теперь начинает указывать новое местоположение (где хранится 2), а я все еще указывает на местоположение, где хранится 1.При оценке
j = j+1
Значение выбирается из 142671248, рассчитывается (если еще не кэшировано) и помещается в новое местоположение 142671236. j делается для указания нового местоположения.Проще говоря, новая копия, создаваемая каждый раз при изменении неизменяемой переменной.
Изменчивость
Изменяемые объекты действуют немного иначе в этом отношении.Когда значение, обозначенное
In [16]: a = []
In [17]: b = a
In [18]: id(a)
Out[18]: 3071546412L
In [19]: id(b)
Out[19]: 3071546412L
, a и b указывают на одно и то же место в памяти.
In [20]: a.append(5)
Место в памяти, обозначенное символом a, изменяется.
In [21]: a
Out[21]: [5]
In [22]: b
Out[22]: [5]
In [23]: id(a)
Out[23]: 3071546412L
In [24]: id(b)
Out[24]: 3071546412L
И a, и b по-прежнему указывают на одну и ту же ячейку памяти.Другими словами, изменяемые переменные действуют в той же области памяти, на которую указывает переменная, вместо создания копии значения, на который указывает переменная, как в случае неизменяемой переменной.