何时在元组周围需要括号?

是否有一个引用某处定义精确地包含括号的元组是否是必需的?

最近这个例子让我很吃惊:

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

使用逗号令牌创build元组的expression式组合称为expression_list 。 运算符优先级的规则不包括expression式列表; 这是因为expression式列表本身不是expression式; 当它们被括在圆括号中时,它们变成expression式。

所以,在Python中任何地方都允许使用一个未封闭的expression_list ,这是语言语法特别允许的,但是不需要 expression这样的地方。

例如, if语句的语法如下:

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

由于引用了生产expression ,所以不允许将未封闭的expression_list作为if语句的主题。 但是, for语句接受一个expression_list

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

所以下面是允许的:

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

任何地方你都可以使用expression_list这个术语,你不需要使用括号。

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

允许expression_list的语法示例:

  • return声明
  • yieldexpression式
  • (包括增加的作业 )
  • for语句 。

对expression式进行 简化 ,为expression_list 简单和复合语句文档将告诉您在Python语法中使用expression_list所有位置。

避免含糊不清,还需要括号。

以下是两个不同的expression式…只是因为某些是“expression式列表”,不会导致您可能期望的expression式列表:)

 (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