2014-10-09 43 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