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