的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
然而令我惊讶,这不是一个语法错误
显然,在常规分配任何工作,如下列:
全切片分配:
>>> 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
用于分配到不同的目标这里也被召唤相应的机构;多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
正好说明一个for
是连续执行勉强简单的赋值语句。
它不一定是有用的被允许。字典中的键值是一个有效的标识符。由于命名空间本身就是字典,所以改变它需要改变很多Python内部。并且解决一些只有在编写不会导致错误的意外代码时才成为问题的问题。 –
@AlanLeuthard我明白你在说什么(并且你的回答很好地表达出来),但更确切的说,是一个['identifier'](https://docs.python.org/2/reference/lexical_analysis.html#语法 - 标记 - 标识符)只能是字母和数字的序列,即实际变量*名称*,而不是其他可分配的表达式,例如['subscription'](https://docs.python.org/2/参考/ expressions.html#语法-令牌订阅)。 – jtbandes
是的。应该有说的目标,而不是标识符 –