Что происходит при x = 10
Если попросить начинающего программиста объяснить, что делает эта строка:
x = 10
то чаще всего ответ будет примерно таким: “В переменную x записывается число 10”.
На первый взгляд всё звучит логично. Мы привыкли представлять переменную как коробку или ячейку памяти, внутрь которой можно что-то положить. Сначала коробка пустая, потом мы кладём туда число, строку или список.
Проблема в том, что Python работает немного иначе.
Чтобы понять многие особенности языка, полезно сразу отказаться от представления о переменных как о контейнерах для данных. Вместо этого стоит думать о переменной как об имени, которое указывает на объект.
Когда Python видит строку:
x = 10
он работает не с переменной, а прежде всего с самим числом 10.
Число 10 является объектом. После того как этот объект появился, имя x связывается с ним.
Если попытаться изобразить это схематично, получится что-то вроде:
x ───► 10
Стрелка здесь показывает, что имя x указывает на объект со значением 10.
На первый взгляд разница кажется незначительной. Какая разница, лежит число в переменной или переменная на него указывает?
На самом деле разница огромна, и её последствия будут сопровождать нас практически во всех следующих статьях.
Представим, что после этого мы пишем ещё одну строку:
y = x
Многие ожидают, что Python создаст вторую копию числа и положит её в новую переменную. Но этого не происходит.
Имя y просто начинает указывать на тот же объект, что и имя x.
Теперь картина выглядит так:
x ─┐
├──► 10
y ─┘
У нас по-прежнему только один объект, но уже два имени, через которые к нему можно обратиться.
Именно поэтому в Python принято разделять понятия «объект» и «имя». Объект хранит данные. Имя позволяет к этим данным обратиться.
Эта идея становится ещё интереснее, когда значение переменной меняется.
Рассмотрим такой код:
x = 10
x = 20
Если мыслить категориями коробок, можно представить, что число 10 внутри переменной каким-то образом заменилось на число 20.
Но в Python происходит другое.
Сначала имя x указывает на объект 10:
x ───► 10
После выполнения второй строки имя начинает указывать на другой объект:
x ───► 20
Сам объект 10 никуда не исчез и не превратился в 20. Просто имя x перестало на него ссылаться.
Это может показаться мелочью, но именно на этой идее построена вся модель работы Python с данными. Позже мы увидим, что она объясняет очень многие вещи: почему изменение списка иногда неожиданно влияет на другую переменную, чем отличается оператор is от ==, почему строки ведут себя иначе, чем списки, и как Python передаёт аргументы в функции.
Пока же достаточно запомнить одну мысль.
Когда вы пишете:
x = 10
Python не кладёт число в переменную.
Он создаёт связь между именем x и объектом 10.
Именно поэтому опытные Python-разработчики обычно говорят не «переменная хранит значение», а «имя ссылается на объект». Это немного менее привычно, зато гораздо ближе к тому, как язык работает на самом деле.