Найти тему
Будни питониста

Присваивание значений.

Для присваивания значения используется оператор =. Переменной, как и в другом языке программирования, вы можете присвоить:

Обычное значение (константу):

х = 1 # Переменной х присвоено значение 1 (число) FirstName = "Denis" # Переменной присвоена строковая константа "Denis"

Значение другой переменной:

а = х

Результат вычисления выражения:

у = х * а + х

Результат вычисления функции:

res = func(y)

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

>>> а = Ь = [5, 4, 3]

>>> а, Ь

((5, 4, 3], (5, 4, 3])

А теперь попробуем изменить объект а:

>>> a[1] = 6

>>> а, b

([5, 6, 3], [5, 6, 3])

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

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

>>> а = b = 1

>>> а= 2

>>> а, b

(2, 1)

Проверить, ссылаются ли переменные на один и тот же объект, можно с помощью оператора is. Например:

>>> а = Ь = [5, 4, 3)

>>> а is Ь

True

>>> Ь is а

True

Как видите, оператор is вернул значение True, что означает, что переменные а и Ь ссылаются на один и тот же объект в памяти. А теперь не будем использовать групповое присваивание, но присвоим переменным а и b одно и то же значение:

>>> а = [5, 4, 3)

>>> b = (5, 4, 3)

>>> а is b

False

>>> b is а

False

Теперь переменные а и b ссылаются на разные объекты в оперативной памяти. Просмотреть, сколько ссылок есть на тот или иной объект, можно с помощью метода sys.getrefcount():

>>> а = 5; b = 5; с = 5;

>>> sys.getrefcount(5)

105 Когда число ссылок на объект станет равно 0, объект будет удален из памяти.

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

>>> а, b, с = 5, 4, 3

>>> а, b, с

(5, 4, 3)

По обе стороны оператора = можно указать последовательности (строки, списки, кортежи, bytes и bytearray), но такие сложные операторы присваивания встречаются в "природе" довольно редко и я бы рекомендовал избегать их использования, если вы хотите сделать программу понятной и читаемой:

>>> а, b, с = "аbс"

>>> х, y, z

( , а,, 'b', , с,)

>>> а, b, с = [1, 2, 3]

>>> а, b, с

(1, 2, 3)

>>> [а, b, с]

>>> а, b, с

( 1, 2, 3)

Количество элементов слева и справа должно совпадать, иначе вы получите сообщение об ошибке:

>>> а, b, с = 1, 2

Traceback (most recent call last):

File "<pyshell # 49>", line 1, in <module>

а, b, с = 1, 2

ValueError: need more than 2 values to unpack

>>>

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

>>> а, b, *с = 1, 2, 3, 4

>>> а, Ь, с

(1, 2, [З, 4])

>>>

Однако такая возможность появилась в Python 3 и в Python 2.7 она не поддерживается.

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

SyntaxError: two starred expressions in assignment