Инструкции присваивания
Цель инструкции присваивания записывается слева от знака равно, а объект, который присваивается, – справа. Цель слева может быть именем или компонентом объекта, а объектом справа может быть произвольное выражение, которое в результате дает объект. В большинстве случаев присваивание выполняется достаточно просто, однако оно обладает следующими особенностями, которые вам следует иметь в виду:
- Инструкция присваивания создает ссылку на объект.
- Переменные создаются при первом присваивании.
- Прежде чем переменную можно будет использовать, ей должно быть присвоено значение.
- Некоторые инструкции неявно тоже выполняют операцию присваивания.
Операция - Интерпретация
spam = ‘Spam’ - Каноническая форма
spam, ham = ‘yum’, ‘YUM’ - Присваивание кортежей (позиционное)
[spam, ham] = [‘yum’, ‘YUM’] - Присваивание списков (позиционное)
a, b, c, d = ‘spam’ - Присваивание последовательностей, обобщенное
a, *b = ‘spam’ - Расширенная операция распаковывания последовательностей
(Python 3.0)
spam = ham = ‘lunch’ - Групповое присваивание одного значения
spams += 42 - Комбинированная инструкция присваивания
(эквивалентно инструкции spams = spams + 42)
Присваивание последовательностей:
Ниже приводится несколько примеров инструкций присваивания последовательностей в действии:
>>> nudge = 1
>>> wink = 2
>>> A, B = nudge, wink # Присваивание кортежей
>>> A, B # Что равносильно A = nudge; B = wink
(1, 2)
>>> [C, D] = [nudge, wink] # Присваивание списков
>>> C, D
(1, 2)
------------------------------------------
>>> nudge = 1
>>> wink = 2
>>> A, B = nudge, wink # Присваивание кортежей
>>> A, B # Что равносильно A = nudge; B = wink
(1, 2)
>>> [C, D] = [nudge, wink] # Присваивание списков
>>> C, D
(1, 2)
------------------------------------------
>>> [a, b, c] = (1, 2, 3) # Кортеж значений присваивается списку переменных
>>> a, c
(1, 3)
>>> (a, b, c) = “ABC” # Строка символов присваивается кортежу переменных
>>> a, c
(‘A’, ‘C’)
------------------------------------------
>>> string = ‘SPAM’
>>> a, b, c, d = string # Одинаковое число элементов с обеих сторон
>>> a, d
(‘S’, ‘M’)
>>> a, b, c = string # В противном случае выводится сообщение об ошибке
...текст сообщения об ошибке опущен...
ValueError: too many values to unpack
------------------------------------------
>>> a, b, c = string[0], string[1], string[2:] # Элементы и срез
>>> a, b, c
(‘S’, ‘P’, ‘AM’)
------------------------------------------
>>> a, b, c = list(string[:2]) + [string[2:]] # Срезы и конкатенация
>>> a, b, c
(‘S’, ‘P’, ‘AM’)
------------------------------------------
>>> (a, b), c = string[:2], string[2:] # Вложенные последовательности
>>> a, b, c
(‘S’, ‘P’, ‘AM’)
------------------------------------------
>>> red, green, blue = range(3)
>>> red, blue
(0, 2)
------------------------------------------
Групповое присваивание
>>> a = b = c = ‘spam’
>>> a, b, c
(‘spam’, ‘spam’, ‘spam’)
------------------------------------------
Зарезервированные слова в версии Python 3.0
False
None
True
and
as
assert
break
class
finally
is
return
continue
for
lambda
try
def
from
nonlocal
while
del
global
not
with
elif
if
or
yield
else
import
pass
except
in
raise
есть несколько вопросов:
ОтветитьУдалить1) слева, цель инструкции присваивания, она может быть именем или компонентом обьекта,
компонентом обьекта имеется ввиду аттрибутом обьекта?
2) справа, обьект который присваивается, написано что там может быть любое выражение которое в итоге дает обьект. что то не могу придумать пример того чтобы в результате какого то выражения было что то другое кроме обьекта.
можете подсказать такую ситуацию?
PS:
статья очень интересная.:)
1) - да присваивать можно к чему угодно
Удалить2) - чуть позже ))
вот еще один момент, не уловил разницы между кортежем и списком.
Удалитьт.е. между [] и ()
>>> a = (c, d) = [5, 6]
>>> a
>>> [5, 6]
а если сделать a=(c, d) = (5, 6)
распечатает
(5, 6)
дополнение: Из книги Россума, в 10.3.2 про Присваивание,
Удалитьтам сказано что используются специальные методы которые контролируют поведение при присваивании. (__setattr__(), __setitem__(), __setslice__())
и из этой же части, там сказано:
Операция присваивания выполняется путем распаковки последовательностей (sequence unpacking),
пока не нашел как происходит распаковка,
есть комбинированная инструкция присваивания:
Удалитьlvalue op= expression.
если lvalue должно быть неизменяемым обьектом, это идентификатор связанный с простым типом?
выражение:
[a,b] += 10
выдает exception:
File "", line 1
SyntaxError: illegal expression for augmented assignment
а что еще за операция в Python3.0
ОтветитьУдалитьa, *b = "spam"?
можешь прокоментировать?
a, *b = 'spam' работает так же как и следующий пример из записи
Удалить>>> string = ‘SPAM’
>>> a, b, c, d = string # Одинаковое число элементов с обеих сторон
>>> a, d
(‘S’, ‘M’)
только в b присвоится кортеж элементами которого будут все буквы кроме 1й тоесть - ['p','a','m'].
По первому комменту отвечу пожже, на минутку заглянул
Комбинированные операции
УдалитьОперацию += и *= можно применять не только к переменным с числовыми, но и со строковыми значениями.
Для строк операция += означает конкатенацию переменной со строкой, находящейся в правой части.
Операция *= подразумевает многократную конкатенацию строки с самой собой. Она имеет смысл, если справа стоит целое положительное число (при отрицательном в в результате получится пустая строка).