【发布时间】:2017-11-03 05:16:12
【问题描述】:
我不小心写了一些这样的代码:
foo = [42]
k = {'c': 'd'}
for k['z'] in foo: # Huh??
print k
但令我惊讶的是,这不是语法错误。相反,它会打印{'c': 'd', 'z': 42}。
我的猜测是该代码按字面意思翻译为:
i = iter(foo)
while True:
try:
k['z'] = i.next() # literally translated to assignment; modifies k!
print k
except StopIteration:
break
但是...为什么语言允许这样做?我希望在for-stmt's target expression 中只允许单个标识符和标识符元组。在任何情况下这实际上是有用的,而不仅仅是一个奇怪的问题?
【问题讨论】:
-
允许它不一定有用。字典中的键值是有效的标识符。由于命名空间本身就是字典,因此更改它需要更改大量 Python 内部结构。并且修复一些只有在您编写不会导致错误的意外代码时才会出现的问题。
-
@AlanLeuthard 我明白你在说什么(你的回答很好地充实了它)但更准确地说,
identifier只能是字母和数字的序列,即实际变量name 而不是其他可分配的表达式,例如subscription。 -
是的。应该说目标而不是标识符
-
哦该死,对不起,这应该是相反的 :-) 不应该在困的时候使用锤子。
标签: python for-loop language-lawyer