Комментарий к разделу Как я могу обойтись без объявления неиспользуемой переменной в цикле 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), а i по-прежнему указывает на место, где хранится 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 по-прежнему указывают на одну и ту же ячейку памяти. Другими словами, изменяемые переменные действуют в той же ячейке памяти, на которую указывает переменная, вместо того, чтобы делать копию значения, указанного переменной, как в случае с неизменяемой переменной.