簡體   English   中英

為什么“not(True) in [False, True]”返回 False?

[英]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

為什么?

運算符優先級2.x , 3.x not的優先級低於in的優先級。 所以它等價於:

>>> not ((True) in [False, True])
False

這就是你想要的:

>>> (not True) in [False, True]
True

正如@Ben 指出的那樣:建議永遠不要寫not(True) ,不要寫not True 前者使它看起來像一個函數調用,而not是一個運算符,而不是一個函數。

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

這完全是關於運算符優先級innot強)。 但是可以通過在正確的位置添加括號來輕松更正:

(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 個角色( precedencechaining )來將其分開,在這種情況下,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 TrueFalse

您可以假設中心對象將在 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上述表達式的結果(沒有任何括號來保持優先級,因為innot運算符具有更高的優先級)。 因此, not True將導致False

另一方面, (not True) in [False, True]等於False in [False, True]TrueFalse包含在列表中)。

為了澄清其他一些答案,一元運算符之后添加括號不會改變其優先級。 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)是完全一樣的。

以下是有關運算符優先級的文檔

in binds tighter than not

這樣做將有助於達到目的

>>> (not True) in [False, True]
True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM