为什么这个Python布尔比较返回三元组?

时间:2015-05-26 08:30:26

标签: python boolean behavior

我在Python 2.7.8的命令行上玩,我遇到了这种行为:

>>> "902".isdigit() == True
True
>>> "902".isdigit(), "2".isdigit() == True
(True, True)
>>> "902".isdigit(), "2".isdigit() == True,True
(True, True, True)
>>> ("902".isdigit(), "2".isdigit()) == (True,True)

我发现这令人惊讶。我原以为>>> "902".isdigit(), "2".isdigit() == True,True只是简单地返回True,好像我已将括号中的两个表达式包围起来,使它们成为元组。为什么Python会返回这个布尔元组而不是单个元素?这个元组代表什么布尔比较?

2 个答案:

答案 0 :(得分:8)

由于:

"902".isdigit(), "2".isdigit() == True,True

被解释为:

("902".isdigit(), ("2".isdigit() == True), True)

请注意,您不应该使用==来测试布尔值;一种更加pythonic的方式来编写测试:

"902".isdigit() and "2".isdigit()

答案 1 :(得分:4)

添加到jonrsharpe的答案:

以这种方式解释它的原因是因为Python解析器无法确定是否:

 "902".isdigit(), "2".isdigit() == True, True

原意是:

("902".isdigit(), ("2".isdigit() == True), True)

或:

("902".isdigit(), "2".isdigit()) == (True, True)

基本上没有办法(从语法角度)来确定这一点而不使用显式括号。

请参阅:Full Grammar Specification但您需要一些BNF / EBNF语法背景)。