为什么if x,y:会导致语法错误?
我想知道为什么下面的代码会引发一个 SyntaxError
错误:
>>> if 1,2:
File "<stdin>", line 1
if 1,2:
^
SyntaxError: invalid syntax
>>>
难道 1,2
不应该被 Python 解释成一个包含两个元素的元组吗?这样在 if 语句中测试时应该会返回 True
吧?下面的示例似乎表明它应该这样工作:
>>> 1,2
(1, 2)
>>> tup = 1,2
>>> bool(tup)
True
>>>
而且,如果你查看 Python 的 if 语句的 文档,你会看到这样写:
if_stmt ::= "if" expression ":" suite ( "elif" expression ":" suite )* ["else" ":" suite]
如你所见,文档中明确说明了 if 语句的语法是 if
关键字后面跟着一个表达式。如果我没记错的话,1,2
确实是一个表达式。
最后,有人可能会说这种语法没什么用,那为什么还要允许它呢?这确实是个问题,但 Python 的哲学 明确指出:
特殊情况不足以打破规则。
那么,为什么会出现 SyntaxError
呢?
2 个回答
-3
你所做的事情并不是你想的那样。
1==1,2:你其实是在声明两个东西。1==1的结果是True,而2就是2。
1==(1,2)=False:它们甚至是两种不同的类型。
如果你写1==1,2:这其实是不可行的。如果你仔细想想我刚才说的,那个逗号不仅是多余的,还是错误的。
1
这和Python如何扫描和解释表达式有关。你会遇到SyntaxError
(语法错误),是因为Python的if
语句不允许在条件之间加逗号。
Python是从左到右读取语句的,如果没有明确使用括号来分隔条件,它会把条件用逗号分开。这就意味着你的表达式被解释成了这样:
(1 == 1), (2)
所以这里并不是把tuple
(元组)分开,而是把两个条件分开了。由于逗号不能用来分隔条件,所以你会得到SyntaxError
。考虑到这一点,我们可以理解为什么在元组周围加上括号会得到不同的结果。括号明确用于分隔,这样Python就能单独解释tuple
并进行比较。在这种情况下,只有一个条件,所以就不会出错。