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

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

В предыдущем руководстве поBasic Data Types in Python вы видели, как могут быть созданы значения различных типов данных Python. Но пока что все показанные значения были буквальными или постоянными значениями:

>>>

>>> print(5.3)
5.3

Если вы пишете более сложный код, вашей программе потребуются данные, которые могут изменяться по мере выполнения программы.

Here’s what you’ll learn in this tutorial: Вы узнаете, как каждый элемент данных в программе Python может быть описан абстрактным терминомobject, и вы узнаете, как управлять объектами, используя символические имена, называемыеvariables.

Бесплатная загрузка PDF: Шпаргалка по Python 3

__ Take the Quiz: Проверьте свои знания с помощью нашей интерактивной викторины «Переменные Python». По окончании вы получите оценку, чтобы вы могли отслеживать прогресс в обучении с течением времени:

Назначение переменной

Думайте о переменной как об имени, прикрепленном к определенному объекту. В Python переменные не нужно объявлять или определять заранее, как это происходит во многих других языках программирования. Чтобы создать переменную, вы просто назначаете ей значение, а затем начинаете использовать его. Присваивание выполняется с помощью единственного знака равенства (=):

>>>

>>> n = 300

Это читается или интерпретируется как «n присвоено значение300». Как только это будет сделано,n можно использовать в операторе или выражении, и его значение будет заменено:

>>>

>>> print(n)
300

Так же, как буквальное значение может отображаться непосредственно из приглашения интерпретатора в сеансе REPL без необходимости вprint(), так и переменная:

>>>

>>> n
300

Позже, если вы измените значениеn и снова воспользуетесь им, вместо него будет подставлено новое значение:

>>>

>>> n = 1000
>>> print(n)
1000
>>> n
1000

Python также позволяет присваивать цепочки, что позволяет присваивать одно и то же значение нескольким переменным одновременно:

>>>

>>> a = b = c = 300
>>> print(a, b, c)
300 300 300

Цепное присвоение, приведенное выше, назначает300 одновременно переменнымa,b иc.

Типы переменных в Python

Во многих языках программирования переменные статически типизированы. Это означает, что переменная первоначально объявляется имеющей определенный тип данных, и любое значение, присвоенное ей в течение срока ее службы, всегда должно иметь этот тип.

Переменные в Python не подпадают под это ограничение. В Python переменной может быть присвоено значение одного типа, а затем позднее переназначено значение другого типа:

>>>

>>> var = 23.5
>>> print(var)
23.5

>>> var = "Now I'm a string"
>>> print(var)
Now I'm a string

Ссылки на объекты

Что на самом деле происходит, когда вы назначаете переменную? Это важный вопрос в Python, потому что ответ несколько отличается от того, что вы найдете во многих других языках программирования.

Python оченьobject-oriented language. Фактически, практически каждый элемент данных в программе на Python является объектом определенного типа или класса. (Этот пункт будет повторяться много раз в течение этих уроков.)

Рассмотрим этот код:

>>>

>>> print(300)
300

При представлении оператораprint(300) интерпретатор делает следующее:

  • Создает целочисленный объект

  • Дает ему значение300

  • Выводит это на консоль

Вы можете видеть, что целочисленный объект создается с помощью встроенной функцииtype():

>>>

>>> type(300)

Переменная Python - это символическое имя, которое является ссылкой или указателем на объект. Как только объект назначен переменной, вы можете ссылаться на объект по этому имени. Но сами данные все еще содержатся в объекте.

Например:

>>>

>>> n = 300

Это назначение создает целочисленный объект со значением300 и присваивает переменнойn, указывающей на этот объект.

Следующий код проверяет, чтоn указывает на целочисленный объект:

>>>

>>> print(n)
300
>>> type(n)

Теперь рассмотрим следующее утверждение:

>>>

>>> m = n

Что происходит, когда он выполняется? Python не создает другого объекта. Он просто создает новое символическое имя или ссылкуm, которая указывает на тот же объект, на который указываетn.

Далее, предположим, что вы делаете это:

>>>

>>> m = 400

Теперь Python создает новый целочисленный объект со значением400, иm становится ссылкой на него.

Наконец, предположим, что этот оператор выполняется следующим образом:

>>>

>>> n = "foo"

Теперь Python создает строковый объект со значением"foo" и ссылается на негоn.

Больше нет ссылки на целочисленный объект300. Он осиротел, и нет возможности получить к нему доступ.

Учебные пособия в этой серии иногда ссылаются на время жизни объекта. Жизнь объекта начинается с момента его создания, когда создается хотя бы одна ссылка на него. В течение времени жизни объекта, как вы видели выше, могут создаваться дополнительные ссылки на него, а также ссылки на него. Объект остается живым, пока на него есть хотя бы одна ссылка.

Когда количество ссылок на объект падает до нуля, он больше не доступен. В этот момент его время жизни истекло. В конечном итоге Python заметит, что он недоступен, и освободит выделенную память, чтобы ее можно было использовать для чего-то другого. На компьютерном жаргоне этот процесс обозначается какgarbage collection.

Идентичность объекта

В Python каждому создаваемому объекту присваивается номер, который однозначно его идентифицирует. Гарантируется, что никакие два объекта не будут иметь одинаковый идентификатор в течение любого периода, в течение которого их время жизни перекрывается. Как только счетчик ссылок на объект упадет до нуля и он будет обработан сборщиком мусора, как это произошло с объектом300 выше, его идентификационный номер становится доступным и может использоваться снова.

Встроенная функция Pythonid() возвращает целочисленный идентификатор объекта. Используя функциюid(), вы можете убедиться, что две переменные действительно указывают на один и тот же объект:

>>>

>>> n = 300
>>> m = n
>>> id(n)
60127840
>>> id(m)
60127840

>>> m = 400
>>> id(m)
60127872

После присвоенияm = n,m иn оба указывают на один и тот же объект, что подтверждается тем фактом, чтоid(m) иid(n) возвращают одно и то же число. После переназначенияm на400,m иn указывают на разные объекты с разными идентификаторами.

Deep Dive: кэширование небольших целочисленных значений

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

>>>

>>> m = 300
>>> n = 300
>>> id(m)
60062304
>>> id(n)
60062896

С помощью оператораm = 300 Python создает целочисленный объект со значением300 и устанавливаетm в качестве ссылки на него. Затемn аналогичным образом присваивается целочисленному объекту со значением300, но не тому же объекту. Таким образом, они имеют разные идентификаторы, что вы можете проверить по значениям, возвращаемымid().

Но учтите это:

>>>

>>> m = 30
>>> n = 30
>>> id(m)
1405569120
>>> id(n)
1405569120

Здесьm иn отдельно назначаются целочисленным объектам, имеющим значение30. Но в этом случаеid(m) иid(n) идентичны!

В целях оптимизации интерпретатор создает объекты для целых чисел в диапазоне[-5, 256] при запуске, а затем повторно использует их во время выполнения программы. Таким образом, когда вы назначаете отдельные переменные целочисленному значению в этом диапазоне, они фактически ссылаются на один и тот же объект.

Имена переменных

В примерах, которые вы видели до сих пор, использовались короткие и лаконичные имена переменных, напримерm иn. Но имена переменных могут быть более подробными. На самом деле, обычно это выгодно, потому что это делает назначение переменной более очевидным на первый взгляд.

Официально имена переменных в Python могут быть любой длины и могут состоять из прописных и строчных букв (A-Z,a-z), цифр (0-9) и символа подчеркивания (_с). Дополнительное ограничение заключается в том, что хотя имя переменной может содержать цифры, первый символ имени переменной не может быть цифрой.

Note: Одним из дополнений к Python 3 была полная поддержка Unicode, которая также позволяет использовать символы Unicode в имени переменной. Вы узнаете о Unicode более подробно в следующем уроке.

Например, все перечисленные ниже являются допустимыми именами переменных:

>>>

>>> name = "Bob"
>>> Age = 54
>>> has_W2 = True
>>> print(name, Age, has_W2)
Bob 54 True

Но это не так, потому что имя переменной не может начинаться с цифры:

>>>

>>> 1099_filed = False
SyntaxError: invalid token

Обратите внимание, что случай является значительным. Строчные и прописные буквы не совпадают. Использование символа подчеркивания также важно. Каждое из следующих значений определяет разные переменные:

>>>

>>> age = 1
>>> Age = 2
>>> aGe = 3
>>> AGE = 4
>>> a_g_e = 5
>>> _age = 6
>>> age_ = 7
>>> _AGE_ = 8

>>> print(age, Age, aGe, AGE, a_g_e, _age, age_, _AGE_)
1 2 3 4 5 6 7 8

Ничто не мешает вам создать две разные переменные в одной программе под названиемage иAge, или, если на то пошло,agE. Но это, вероятно, опрометчиво. Конечно, это может запутать любого, кто пытается прочитать ваш код, и даже вас самих, после того, как вы от него отошли.

Целесообразно дать переменной достаточно информативное имя, чтобы понять, для чего она используется. Например, предположим, что вы подсчитываете количество людей, окончивших колледж. Вы можете выбрать любой из следующих вариантов:

>>>

>>> numberofcollegegraduates = 2500
>>> NUMBEROFCOLLEGEGRADUATES = 2500
>>> numberOfCollegeGraduates = 2500
>>> NumberOfCollegeGraduates = 2500
>>> number_of_college_graduates = 2500

>>> print(numberofcollegegraduates, NUMBEROFCOLLEGEGRADUATES,
... numberOfCollegeGraduates, NumberOfCollegeGraduates,
... number_of_college_graduates)
2500 2500 2500 2500 2500

Все они, вероятно, лучший выбор, чемn,ncg и т.п. По крайней мере, вы можете сказать по названию, что значение переменной должно представлять.

С другой стороны, они не обязательно одинаково разборчивы. Как и во многих вещах, это вопрос личных предпочтений, но большинству людей было бы сложнее читать первые два примера, где все буквы собраны вместе, особенно один из всех заглавных букв. Наиболее часто используемые методы построения имени переменной из нескольких слов - это последние три примера:

  • Camel Case: Второе и последующие слова пишутся с заглавной буквы, чтобы границы слов было легче увидеть. (Предположительно, в определенный момент кого-то поразило, что заглавные буквы, разбросанные по всему имени переменной, смутно напоминают верблюжьих горбов.)

    • Пример:numberOfCollegeGraduates

  • Pascal Case: Идентично Camel Case, за исключением того, что первое слово также пишется с большой буквы.

    • Пример:NumberOfCollegeGraduates

  • Snake Case: Слова разделены подчеркиванием.

    • Пример:number_of_college_graduates

Программисты горячо спорят с удивительным пылом, какой из них предпочтительнее. Приличные аргументы могут быть сделаны для всех из них. Используйте любой из трех наиболее привлекательных для вас. Выберите один и используйте его последовательно.

Позже вы увидите, что переменные - не единственные вещи, которым можно дать имена. Вы также можете называть функции, классы, модули и так далее. Правила, которые применяются к именам переменных, также применяются к идентификаторам, более общему термину для имен, данных объектам программы.

Style Guide for Python Code, также известный какPEP 8, содержитNaming Conventions, в котором перечислены рекомендуемые стандарты для имен различных типов объектов. ПКП 8 включает в себя следующие рекомендации:

  • Snake Case следует использовать для функций и имен переменных.

  • Pascal Case должен использоваться для имен классов. (PEP 8 именует это как «CapWords».)

Зарезервированные слова (ключевые слова)

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

В Python 3.6 есть 33 зарезервированных ключевых слова:

Ключевые слова Python
     

False

def

if

raise

None

del

import

return

True

elif

in

try

and

else

is

while

as

except

lambda

with

assert

finally

nonlocal

yield

break

for

not

class

from

or

continue

global

pass

Вы можете просмотреть этот список в любое время, набравhelp("keywords") в интерпретаторе Python. Зарезервированные слова чувствительны к регистру и должны использоваться точно так, как показано. Все они полностью строчные, за исключениемFalse,None иTrue.

Попытка создать переменную с тем же именем, что и у любого зарезервированного слова, приводит к ошибке:

>>>

>>> for = 3
SyntaxError: invalid syntax

Заключение

В этом руководстве были рассмотрены основы Pythonvariables, включая ссылки на объекты и их идентификационные данные, а также присвоение имен идентификаторам Python.

Теперь вы хорошо разбираетесь в некоторых типах данных Python и знаете, как создавать переменные, которые ссылаются на объекты этих типов.

Далее вы увидите, как объединить объекты данных вexpressions с использованием различныхoperations.

__ Take the Quiz: Проверьте свои знания с помощью нашей интерактивной викторины «Переменные Python». По окончании вы получите оценку, чтобы вы могли отслеживать прогресс в обучении с течением времени: