为什么在for
循环中循环一个隐式元组是可以的,但是当您理解时会出现语法错误,这有什么原因吗?
例如:
for i in 'a','b','c':
print(i)
'a'
'b'
'c'
但在一种理解中:
>>> [i for i in 'a','b','c']
File "<stdin>", line 1
[i for i in 'a','b','c']
^
SyntaxError: invalid syntax
这有什么原因吗?我不确定正确的术语,所以我的搜索没有得到任何有用的结果。
更新:
根据注释,这个语法对Python2.x有效,但对Python3.x无效。
发布于 2016-12-13 18:22:54
这在Python3中发生了变化,主要是为了使列表理解与生成器表达式更加一致。
对于for-循环和列表理解,在使用不带括号的元组时没有任何歧义,因为前者总是以冒号结尾,而后者则以结束括号或for/if
关键字结尾。
但是,生成器表达式的部分设计要求它们可以用作函数参数:
>>> list(i for i in range(3))
[0, 1, 2]
这会为非括号的元组造成一些歧义,因为任何逗号都可能引入新的参数:
>>> list(i for i in 0, 1, 2)
File "<stdin>", line 1
SyntaxError: Generator expression must be parenthesized if not sole argument
因此,元组必须始终在生成器表达式中括号,并且为了保持一致性,现在同样的限制也适用于列表理解。
PS:
写了一篇文章,在他的Python历史博客中列出了关于这个主题的所有细节:
发布于 2016-12-13 18:22:10
因为第一个代码中的for i in
与第二个代码中的for i in
是不同的语法结构。
第一个案例是语句,该语句具有语法。
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
'a', 'b', 'c'
绝对是一个expression_list
,所以这是可行的。
然而,在第二种情况下,方括号内的内联for
强制将代码解释为列表理解,而在Python3中,列表理解必须具有语法。
comprehension ::= expression comp_for
comp_for ::= "for" target_list "in" or_test [comp_iter]
comp_iter ::= comp_for | comp_if
comp_if ::= "if" expression_nocond [comp_iter]
注意,in
后面的部分必须是or_test
,但是逗号分隔的表达式创建表达式列表,表达式列表不能是or_test
--或者,换句话说,or
具有比逗号更高的优先级。Python因此认为理解以逗号结尾,因此列表中的三个元素是:
i for i in 'a'
'b'
'c'
它显然是无效的(除非您将i for i in 'a'
放在括号中)。
至于为什么这在Python 2中有效..。我还在找呢。
发布于 2016-12-14 16:09:23
我认为问题就在这里:在后一种情况下,迭代哪些对象并不明显:
>>> [i for i in ('a','b','c')]
['a', 'b', 'c']
元素之间的边界在哪里?它是由三个元素组成的数组吗:生成器和两个整数?如下所示:
>>> [(i for i in 'a'),'b','c']
[<generator object <genexpr> at 0x10cefeeb8>, 'b', 'c']
for
没有这样的含糊不清,所以它不需要括号。
https://stackoverflow.com/questions/41127441
复制相似问题