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
有人能解釋一下嗎?
比方說,我們有與真正的運營商比較列表的成員
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 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
是不是第一個比較說'In(1,a)Eq(a,True)'?否則它會返回'True',因爲'1 == True'是'True',但'a == True'是'False',對吧? – 2014-10-09 07:41:31
@Neftas:你是對的。這是我的答案中的一個簡單的錯字。現在已經修復了。謝謝。 – 2014-10-09 08:04:22