2014-10-09 44 views
1

比方说,我们有与真正的运营商比较列表的成员

a = [1, 2] 
在解释

然后,

for e in a: print e in a 

打印

True 
True 

但下面的代码不作感觉我或我的任何蟒蛇专家朋友

for e in a: print e in a == True 

打印

False 
False 

有人能解释一下吗?

回答

1

如果我们熬了混乱表达了下来,那就是:

1 in a == True 

这让False(我们可能会认为True)。因此,让我们用ast模块来检查它:

>>> 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()) 
     ])) 
    ]) 

你看到的区别:

>>> 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()) 
     ])) 
    ]) 

与加括号中的版本,它的工作原理,你可能希望的方式进行比较?第二个就像我们预计的那样,就像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

+1

是不是第一个比较说'In(1,a)Eq(a,True)'?否则它会返回'True',因为'1 == True'是'True',但'a == True'是'False',对吧? – 2014-10-09 07:41:31

+1

@Neftas:你是对的。这是我的答案中的一个简单的错字。现在已经修复了。谢谢。 – 2014-10-09 08:04:22