使用True运算符比较列表的成员资格

时间:2014-10-09 05:39:40

标签: python python-2.7 conditional

我们说我们有

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

有人可以解释一下吗?

1 个答案:

答案 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