[英]Why does "not(True) in [False, True]" return False?
如果我這樣做:
>>> False in [False, True]
True
那返回True
。 僅僅因為False
在列表中。
但如果我這樣做:
>>> not(True) in [False, True]
False
返回False
。 而not(True)
等於False
:
>>> not(True)
False
為什么?
not x in y
被評估為x not in y
通過反匯編代碼,您可以准確地看到發生了什么。 第一種情況按您的預期工作:
>>> x = lambda: False in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (False)
3 LOAD_GLOBAL 0 (False)
6 LOAD_GLOBAL 1 (True)
9 BUILD_LIST 2
12 COMPARE_OP 6 (in)
15 RETURN_VALUE
第二種情況, True not in [False, True]
計算為True not in [False, True]
,這顯然是False
:
>>> x = lambda: not(True) in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (True)
3 LOAD_GLOBAL 1 (False)
6 LOAD_GLOBAL 0 (True)
9 BUILD_LIST 2
12 COMPARE_OP 7 (not in)
15 RETURN_VALUE
>>>
你想要表達的是(not(True)) in [False, True]
中的(not(True)) in [False, True]
,正如預期的那樣是True
,你可以明白為什么:
>>> x = lambda: (not(True)) in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (True)
3 UNARY_NOT
4 LOAD_GLOBAL 1 (False)
7 LOAD_GLOBAL 0 (True)
10 BUILD_LIST 2
13 COMPARE_OP 6 (in)
16 RETURN_VALUE
運算符優先級。 in
綁定比not
更緊密,因此您的表達式等效於not((True) in [False, True])
。
這完全是關於運算符優先級( in
比not
強)。 但是可以通過在正確的位置添加括號來輕松更正:
(not(True)) in [False, True] # prints true
寫作:
not(True) in [False, True]
是一樣的:
not((True) in [False, True])
它查看True
是否在列表中並返回結果的“not”。
它not True in [False, True]
評估為not True in [False, True]
,它返回False
因為True
在[False, True]
如果你試試
>>>(not(True)) in [False, True]
True
你得到了預期的結果。
除了提到not
的優先級低於in
的其他答案之外,實際上您的陳述等效於:
not (True in [False, True])
但請注意,如果您不將您的條件與其他條件分開,python 將使用 2 個角色( precedence
或chaining
)來將其分開,在這種情況下,python 使用優先級。 另外,請注意,如果要分隔條件,則需要將所有條件放在括號中,而不僅僅是對象或值:
(not True) in [False, True]
但如前所述,python 對鏈接的運算符進行了另一個修改:
基於python 文檔:
請注意,比較、成員資格測試和身份測試都具有相同的優先級,並且具有如比較部分所述的從左到右的鏈接功能。
例如以下語句的結果是False
:
>>> True == False in [False, True]
False
因為python會鏈接如下語句:
(True == False) and (False in [False, True])
這正是False and True
是False
。
您可以假設中心對象將在 2 個操作和其他對象之間共享(在這種情況下為 False)。
請注意,它也適用於所有比較,包括成員測試和身份測試操作,這些操作遵循操作數:
in, not in, is, is not, <, <=, >, >=, !=, ==
例子 :
>>> 1 in [1,2] == True
False
另一個著名的例子是 number range :
7<x<20
這等於:
7<x and x<20
讓我們把它看作一個集合包含檢查操作: [False, True]
是一個包含一些元素的列表。
True in [False, True]
的表達式True in [False, True]
返回True
,因為True
是包含在列表中的元素。
因此, not True in [False, True]
給出了“布爾相反數”, not
上述表達式的結果(沒有任何括號來保持優先級,因為in
比not
運算符具有更高的優先級)。 因此, not True
將導致False
。
另一方面, (not True) in [False, True]
等於False in [False, True]
即True
( False
包含在列表中)。
為了澄清其他一些答案,在一元運算符之后添加括號不會改變其優先級。 not(True)
不會使not
更緊密地綁定到True
。 它只是True
周圍的一組冗余括號。 它與(True) in [True, False]
。 括號沒有任何作用。 如果您希望綁定更緊密,則必須在整個表達式周圍加上括號,這意味着運算符和操作數,即(not True) in [True, False]
。
要以另一種方式看待這一點,請考慮
>>> -2**2
-4
**
比-
結合得更緊密,這就是為什么你得到二平方的負數,而不是負二的平方(這將是正四)。
如果你確實想要負二的平方怎么辦? 顯然,您需要添加括號:
>>> (-2)**2
4
但是,期望以下給出4
不合理的
>>> -(2)**2
-4
因為-(2)
與-2
相同。 括號完全沒有作用。 not(True)
是完全一樣的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.