什么时候围绕一个元组需要括号?

时间:2013-04-15 14:31:32

标签: python syntax tuples

是否有一个参考某处确切地定义了用括号括起元组是否需要?

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

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

3 个答案:

答案 0 :(得分:40)

使用逗号标记组合表达式来创建元组称为expression_listoperator precedence的规则不包括表达列表;这是因为表达式列表本身不是表达式;当括在括号中时,它们就成了表达式。

因此,在Python的任何地方都允许使用未被封闭的expression_list语言语法特别允许,但,其中expression是必需的。

例如,if statement的语法如下:

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

由于引用了生产expression,因此不允许将未公开的expression_list作为if语句的主题。但是,for statement接受expression_list

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

所以允许以下内容:

for x in 1, 2, 3:
    print(x)

答案 1 :(得分:12)

在允许您使用expression_list字词的任何地方,您都不需要使用括号。

if statement需要expression,不支持expression_list

允许expression_list的语法示例:

点击expression_list的{​​{3}},ExpressionsSimple文档会告诉您在Python语法中使用expression_list的所有位置。

答案 2 :(得分:1)

当您希望避免含糊不清时,也需要括号。

以下是两种不同的表达方式......只是因为某些内容是一个表达式列表&#39;,并不会导致您可能期望的表达式列表:)

(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