在CPython 2.7.10和3.4.3以及PyPy 2.6.0(Python 2.7.9)中,为for循环中的名称列表使用表达式(或其中的一些子集)显然是合法的。下面是一个典型的循环:for循环名称列表表达式是否合法?
>>> for a in [1]: pass
...
>>> a
1
但你也可以使用属性的对象:
>>> class Obj(object): pass
...
>>> obj = Obj()
>>> for obj.b in [1]: pass
...
>>> obj.b
1
你甚至可以从表达式中使用属性:
>>> for Obj().c in [1]: pass
...
但并不是所有的表达式似乎工作:
>>> for (True and obj.d) in [1]: pass
...
File "<stdin>", line 1
SyntaxError: can't assign to operator
但是只要属性在外面,他们就会这样做?
>>> for (True and obj).e in [1]: pass
...
>>> obj.e
1
或者什么是可分配的?
>>> for {}['f'] in [1]: pass
...
我很惊讶这些都是Python中的合法语法。我希望只有名字被允许。这些甚至应该工作吗?这是一个疏忽吗?这是Pyyy恰好也实现了CPython的实现细节吗?
是((True and obj).e =“hello”'有效的语法? –
......回答我自己的问题:不,事实并非如此。 –
在dictionary.items()中为'k,v做些什么? –