当需要或不需要用括号括起来的元组时,是否有精确定义的引用?
这是一个最近让我感到惊讶的例子:
>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
File "<stdin>", line 1
if 0, in d:
^
SyntaxError: invalid syntax
使用逗号标记组合表达式以创建元组称为expression_list
. 运算符优先级规则不包括表达式列表;这是因为表达式列表本身不是表达式;当它们被括在括号中时,它们成为表达式。
expression_list
因此,在 Python 中任何语言语法明确允许的地方都允许使用未封闭的,但在需要这样expression
的地方则不允许。
例如if 语句的语法如下:
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]
因为引用了产生式,所以不允许expression
未封闭的 s 作为语句的主题。但是,for 语句接受:expression_list
if
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
:
阅读Expressions、Simple和Compound statements文档expression_list
将告诉您expression_list
Python 语法中使用的所有位置。
当您想避免歧义时,也需要括号。
以下是两个不同的表达式...仅仅因为某些东西是“表达式列表”,不会导致您可能期望的表达式列表:)
(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