Для присваивания значения используется оператор =. Переменной, как и в другом языке программирования, вы можете присвоить:
Обычное значение (константу):
х = 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