我们说我们有
a = [1, 2]
然后在翻译中,
for e in a: print e in a
打印
True
True
但以下代码对我或我的任何python专家朋友都没有意义
for e in a: print e in a == True
打印
False
False
有人可以解释一下吗?
答案 0 :(得分:1)
如果我们把令人困惑的表达下来,那就是:
1 in a == True
这会给False
(我们可能预期True
)。所以让我们使用ast
模块来检查它:
>>> import ast
>>> print ast.dump(ast.parse('1 in a == True'))
Module(body=[
Expr(value=Compare(
left=Num(n=1),
ops=[In(), Eq()],
comparators=[
Name(id='a', ctx=Load()),
Name(id='True', ctx=Load())
]))
])
与添加括号的版本进行比较,该版本的工作方式与您预期的方式相同:
>>> print ast.dump(ast.parse('(1 in a) == True'))
Module(body=[
Expr(value=Compare(
left=Compare(
left=Num(n=1),
ops=[In()],
comparators=[
Name(id='a', ctx=Load())
]),
ops=[Eq()],
comparators=[
Name(id='True', ctx=Load())
]))
])
你看到了区别吗?第二个就像我们所期望的那样Eq(In(1, a), True)
。但第一个是In(1, a) Eq(a, True)
。什么?这两件事怎么结合在一起?好吧,它们形成一个连词,如and
。
因此,第一个表达式相当于1 in a and a == True
。
但为什么?
这是因为Python支持“链式条件”,如下所示:
1 < 3 < 5
你的例子只是附带损害:显然不仅像<
这样的条件链接,而且in
也是重要的。这对我来说并不直观,但这就是它的工作原理。您可以在此处详细了解链接:https://docs.python.org/2/reference/expressions.html#not-in