51

当需要或不需要用括号括起来的元组时,是否有精确定义的引用?

这是一个最近让我感到惊讶的例子:

>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
  File "<stdin>", line 1
    if 0, in d:
        ^
SyntaxError: invalid syntax
4

3 回答 3

48

使用逗号标记组合表达式以创建元组称为expression_list. 运算符优先级规则不包括表达式列表;这是因为表达式列表本身不是表达式;当它们被括在括号中时,它们成为表达式。

expression_list因此,在 Python 中任何语言语法明确允许的地方都允许使用未封闭的,但需要这样expression的地方则不允许。

例如if 语句的语法如下:

if_stmt ::=  "if" expression ":" suite
             ( "elif" expression ":" suite )*
             ["else" ":" suite]

因为引用了产生式,所以不允许expression未封闭的 s 作为语句的主题。但是,for 语句接受:expression_listifexpression_list

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

所以以下是允许的:

for x in 1, 2, 3:
    print(x)
于 2013-04-15T14:40:52.077 回答
15

在允许使用该expression_list术语的任何地方,都不需要使用括号。

if语句需要expression,并且不支持expression_list

允许的语法示例expression_list

阅读ExpressionsSimpleCompound statements文档expression_list将告诉您expression_listPython 语法中使用的所有位置。

于 2013-04-15T14:41:43.580 回答
0

当您想避免歧义时,也需要括号。

以下是两个不同的表达式...仅仅因为某些东西是“表达式列表”,不会导致您可能期望的表达式列表:)

(1, 2, 3) + (4, 5) # results in (1, 2, 3, 4, 5) because + does sequence.extend on the tuples
1, 2, 3 + 4, 5     # this results in (1, 2, 7, 5) because + adds the elements, since there were no parentheses to protect the separate tuples
于 2016-11-22T19:12:48.187 回答