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
答案 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
)。正式地,如果
a
,b
,c
,...,y
,z
是表达式,op1
,op2
,...,opN
是比较运算符,a op1 b op2 c ... y opN z
相当于a op1 b and b op2 c and ... y opN z
,但 每个表达式最多只评估一次。