语法无效(对于循环括号/括号)

时间:2016-03-26 14:35:52

标签: python syntax-error

以下代码行输出SyntaxError: invalid syntax

for (i in range(-WIDTH,WIDTH)):

下一个没有错误。我不知道这里应该是什么语法错误。所以我只是出于好奇而问。我猜测括号会阻止表达式的评估。

for i in range(-WIDTH,WIDTH):

1 个答案:

答案 0 :(得分:7)

你的括号基本上只会让解析器感到困惑。

有一些原因可以让你在for之后有一个开放的paren,最明显的是使用元组解包:

>>> for (x, y) in zip(range(5), range(6, 11)):
...   print(x, '->', y)
... 
0 -> 6
1 -> 7
2 -> 8
3 -> 9
4 -> 10

此外,可以在Python的大量地方使用parens进行简单分组,例如分解长行时:

>>> s = ("This is "
... "a really awkward way "
... "to write a "
... "long string "
... "over several lines")
>>> 
>>> s
'This is a really awkward way to write a long string over several lines'

所以解析器不会真的抱怨它。

但是,如您所知,forsupposed to read like this

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

这意味着通过这种方式分组,您构建的循环无效。从本质上讲,你的内容是没有in,因为它被括号括起来target_list。希望这是有道理的。

一种更清楚地了解正在发生的事情的方法:在你的关闭之后写下你的for循环的其余部分(在expression_list中)。然后你会得到一个更明确的错误,说明它是如何解释这个陈述的。

>>> for (i in range(-WIDTH, WIDTH)) in range(-WIDTH, WIDTH):
...   print(i)
... 
  File "<stdin>", line 1
SyntaxError: can't assign to comparison

所以它会让你这样做,但x in y的结果将是一个布尔值,它不能作为赋值的目标。您收到的原始错误是因为它在找到您的:之前已经到达in,这是一种旧的无效语法,就像您刚刚写了for x:一样。