Найти тему

Переменные в Python

После предыдущего поста на меня неожиданно начали подписываться люди. Чувствую прилив ответственности и небольшой приступ паники :) Сегодня подготовил небольшой конспект по общетеоретическим вопросам и их реализации в Python.

Связывание переменной - это создание пары имя-значение в рамках программы. В общих случаях процесс происходит примерно так: создается объект, а переменной присваивается ссылка на этот объект. В случае, когда несколько переменных имеют одинаковое значение в коде программы, то они все ссылаются на один объект. Если вам нужно перепривязать переменную, например a = [1, 2] на a = (1,2) , то создается новый объект, и ссылка с переменной "а" закрепляется за ним. После этого сборщик мусора проверяет, есть ли на старый объект еще ссылки в программе и, если нет, то уничтожает его.

С этим связан один момент, который всплывает при работе со списками. Если вы привязываете к списку другую переменную, то она так же получает на него ссылку. Воздействуя через любую из привязанных к списку, вы воздействуете через ссылку на сам объект, поэтому результат изменяется для всех переменных. Чтобы этого избежать есть несколько вариантов записи, например a = old_list.copy(), a = list(old_list) и т.д. Используя эти записи вы создаете копию первоначального списка, а не просто получаете дополнительную ссылку на него.

id() возвращает идентификатор, который является адресом объекта в памяти и не меняется на время существования объекта
id() возвращает идентификатор, который является адресом объекта в памяти и не меняется на время существования объекта

Область видимости переменной определяет, в какой части программы можно взаимодействовать с этой переменной. Начиная с Python 3 существует 3 области видимости:

  • Локальная. Устанавливается по умолчанию и распространяется только в локальной области, например отдельно взятой функции. Поэтому в примере ниже после переопределения, которое расположено внутри функции, значение переменной не поменялось. Не поменялось оно и после исполнения функции. Мы просто создали новую переменную с именем идентичным первой, но содержащую ссылку на другой объект.
Никакой другой цифре не заменить так просто ту самую
Никакой другой цифре не заменить так просто ту самую
  • Глобальная (global). Если мы захотим использовать объявленную ранее переменную в нашем модуле, нужно будет добавить global перед её именем. Тогда, в текущем блоке кода, мы будем взаимодействовать именно с нашей переменной, а не создавать новую. Кроме того, если переменная не будет найдена, то global позволяет её создать. ВАЖНО: не стоит менять или создавать глобальные переменные в функциях, это крайне плохо влияет на читаемость кода (получилось как во вредных советах, но это еще и один из самых простых способов показать как работают области видимости)
Не стоит так делать
Не стоит так делать
  • Нелокальная (nonlocal). Область добавленная в Python 3.X. В отличие от global области видимости, при которой осуществляется поиск по всему модулю, в nonlocal поиск осуществляется только по родительской функции. Nonlocal переменную можно объявлять только внутри функции и само использование этой области подразумевает, что переменная уже объявлена. Если переменная не будет найдена, вы словите ошибку.
-4

Спасибо за прочтение, надеюсь помог разложить некоторые вещи по полочкам. До встречи в следующих постах (на подходе следующие главы "Чистого кода")