python中的布尔比较

时间:2017-10-18 16:16:59

标签: python syntax boolean-logic

Python似乎奇怪地评估(我认为)将是相对简单的语法。任何人都可以了解幕后发生的事情吗?在第一种情况下,python认为发生了什么?

>>> x = 'foo'
>>> 'f' in x == True
False
>>> ('f' in x) == True
True
>>> 'f' in (x == True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable

1 个答案:

答案 0 :(得分:2)

您在此处看到的是chained comparisons

'f' in x == True

in==都是比较。现在Python用隐式 and解释链式比较解释器。所以你基本上写了:

'f' in x and x == True

,第二次检查失败。

例如,如果您写:

,则会发生同样的情况
a < b in c

它简称:

a < b and b in c

(表达式只评估一次)。

如果我们看一下文档,我们会看到有11个比较器:

comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"

并进一步声明:

  

比较可以任意链接,例如,x < y <= z   等同于x < y and y <= z,但仅评估 y   一次(但在两种情况下,x < y时根本不评估z   发现是false)。

     

正式地,如果abc,...,yz是表达式,op1,   op2,...,opN是比较运算符,a op1 b op2 c ... y opN z相当于a op1 b and b op2 c and ... y opN z,但   每个表达式最多只评估一次。