8 октября 2012 г.

Присваивание


Инструкции присваивания

Цель инструкции присваивания  записывается слева от знака равно, а объект, который присваивается, – справа. Цель слева может быть именем или компонентом объекта, а объектом справа может быть произвольное выражение, которое в результате дает объект. В большинстве случаев присваивание выполняется достаточно просто, однако оно обладает следующими особенностями, которые вам следует иметь в виду:
  • Инструкция  присваивания  создает  ссылку  на  объект.
  • Переменные создаются при первом присваивании.
  • Прежде чем переменную можно будет использовать, ей должно быть присвоено значение.
  • Некоторые инструкции неявно тоже выполняют операцию присваивания.
Формы инструкции присваивания
Операция - Интерпретация
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

8 комментариев:

  1. есть несколько вопросов:
    1) слева, цель инструкции присваивания, она может быть именем или компонентом обьекта,
    компонентом обьекта имеется ввиду аттрибутом обьекта?
    2) справа, обьект который присваивается, написано что там может быть любое выражение которое в итоге дает обьект. что то не могу придумать пример того чтобы в результате какого то выражения было что то другое кроме обьекта.
    можете подсказать такую ситуацию?

    PS:
    статья очень интересная.:)

    ОтветитьУдалить
    Ответы
    1. 1) - да присваивать можно к чему угодно
      2) - чуть позже ))

      Удалить
    2. вот еще один момент, не уловил разницы между кортежем и списком.
      т.е. между [] и ()
      >>> a = (c, d) = [5, 6]
      >>> a
      >>> [5, 6]

      а если сделать a=(c, d) = (5, 6)
      распечатает
      (5, 6)

      Удалить
    3. дополнение: Из книги Россума, в 10.3.2 про Присваивание,
      там сказано что используются специальные методы которые контролируют поведение при присваивании. (__setattr__(), __setitem__(), __setslice__())

      и из этой же части, там сказано:
      Операция присваивания выполняется путем распаковки последовательностей (sequence unpacking),
      пока не нашел как происходит распаковка,



      Удалить
    4. есть комбинированная инструкция присваивания:
      lvalue op= expression.
      если lvalue должно быть неизменяемым обьектом, это идентификатор связанный с простым типом?

      выражение:
      [a,b] += 10
      выдает exception:
      File "", line 1
      SyntaxError: illegal expression for augmented assignment

      Удалить
  2. а что еще за операция в Python3.0
    a, *b = "spam"?
    можешь прокоментировать?

    ОтветитьУдалить
    Ответы
    1. a, *b = 'spam' работает так же как и следующий пример из записи
      >>> string = ‘SPAM’
      >>> a, b, c, d = string # Одинаковое число элементов с обеих сторон
      >>> a, d
      (‘S’, ‘M’)
      только в b присвоится кортеж элементами которого будут все буквы кроме 1й тоесть - ['p','a','m'].
      По первому комменту отвечу пожже, на минутку заглянул

      Удалить
    2. Комбинированные операции
      Операцию += и *= можно применять не только к переменным с числовыми, но и со строковыми значениями.
      Для строк операция += означает конкатенацию переменной со строкой, находящейся в правой части.
      Операция *= подразумевает многократную конкатенацию строки с самой собой. Она имеет смысл, если справа стоит целое положительное число (при отрицательном в в результате получится пустая строка).

      Удалить