Ответ 1
Цикл for
следует стандартным правилам назначения, поэтому то, что работает на LHS имени ванили, должно работать с for
:
Каждый элемент в свою очередь присваивается целевому списку с использованием стандартного правила для присвоений
Конструкция for
просто вызывает основополагающий механизм назначения цели, который в случае вашего образца кода STORE_SUBSCR
:
>>> foo = [42]
>>> k = {'c': 'd'}
>>> dis.dis('for k["e"] in foo: pass')
1 0 SETUP_LOOP 16 (to 18)
2 LOAD_NAME 0 (foo)
4 GET_ITER
>> 6 FOR_ITER 8 (to 16)
8 LOAD_NAME 1 (k)
10 LOAD_CONST 0 ('e')
12 STORE_SUBSCR <--------------------
14 JUMP_ABSOLUTE 6
>> 16 POP_BLOCK
>> 18 LOAD_CONST 1 (None)
20 RETURN_VALUE
Но, к моему удивлению, это была не синтаксическая ошибка
По-видимому, все, что работает в регулярном назначении, такое как:
полное назначение slice:
>>> for [][:] in []:
... pass
...
>>>
подписка на список
>>> for [2][0] in [42]:
... pass
...
>>>
подписка на словарь и т.д. будут действительными целевыми кандидатами, при этом одиночное исключение будет привязанным назначением; хотя, я тайно думаю, что можно приготовить какой-то грязный синтаксис для выполнения цепочки.
Я ожидал бы только одиночные идентификаторы и кортежи идентификаторов
Я не могу придумать хороший прецедент для словарного ключа в качестве цели. Кроме того, более читабельно выполнять назначение ключа словаря в теле цикла, чем использовать его как цель в предложении for
.
Однако расширенная распаковка (Python 3), которая очень полезна при регулярных назначениях, также одинаково удобна в цикле for:
>>> lst = [[1, '', '', 3], [3, '', '', 6]]
>>> for x, *y, z in lst:
... print(x,y,z)
...
1 ['', ''] 3
3 ['', ''] 6
Также вызван соответствующий механизм назначения для разных целей цели; multiple STORE_NAME
s:
>>> dis.dis('for x, *y, z in lst: pass')
1 0 SETUP_LOOP 20 (to 22)
2 LOAD_NAME 0 (lst)
4 GET_ITER
>> 6 FOR_ITER 12 (to 20)
8 EXTENDED_ARG 1
10 UNPACK_EX 257
12 STORE_NAME 1 (x) <-----
14 STORE_NAME 2 (y) <-----
16 STORE_NAME 3 (z) <-----
18 JUMP_ABSOLUTE 6
>> 20 POP_BLOCK
>> 22 LOAD_CONST 0 (None)
24 RETURN_VALUE
Показывает, что a for
- это просто простые операторы присваивания, выполняемые последовательно.