2017-10-18 139 views
1

Python似乎奇怪地評價(我認爲)會是相對直接的語法。任何人都可以點亮幕後幕後發生的事情嗎? python認爲在第一種情況下發生了什麼?Python中的布爾比較

>>> x = 'foo' 
>>> 'f' in x == True 
False 
>>> ('f' in x) == True 
True 
>>> 'f' in (x == True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'bool' is not iterable 
+2

第一行就像'f in x'和'x == True'(鏈式比較)。有地方有一個愚蠢的。無論如何,你需要x中的'f' –

回答

2

你在這裏看到的是什麼chained comparisons

'f' in x == True 

兩個in==都是比較。現在Python解釋鏈接比較解釋器與隱含and。所以你基本上寫了:

'f' in x and x == True 

第二次檢查失敗。

a < b in c 

它是短期的:

a < b and b in c 

(除了表達式只計算一次)

同樣的,如果你比如寫操作。

如果我們看一看的文件,我們可以看到,有11個比較:

comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" 
        | "is" ["not"] | ["not"] "in" 

,此外它指出:

比較可以鏈接任意 ,例如x < y <= z是 等價於x < y and y <= z,除了y僅評估 一次(但在兩種情況下,當x < y爲 發現爲false時,根本不評估z。

在形式上,如果abc,...,yz是表達式和​​op1op2,...,opN是比較操作符,然後a op1 b op2 c ... y opN z相當於a op1 b and b op2 c and ... y opN z,除了 每個表達是至多評估一次。

+0

謝謝!這正是我正在尋找的答案,並附有文檔鏈接。我會盡快接受這個答案:) – lbear