是否有一个参考某处确切地定义了用括号括起元组是否需要?
这是最近让我感到惊讶的一个例子:
>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
File "<stdin>", line 1
if 0, in d:
^
SyntaxError: invalid syntax
答案 0 :(得分:40)
使用逗号标记组合表达式来创建元组称为expression_list
。 operator 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}},Expressions和Simple文档会告诉您在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