簡體   English   中英

將 None 與 Python3 中的幾個變量進行比較

[英]Comparing None to several variables in Python3

有沒有人可以告訴我為什么我得到這種類型的返回值?

>>> a = 7
>>> b = None
>>> bool(a and b)
False
>>> bool((a is None) and (b is None))
False
>>> bool((a and b) is None) # (a and b) eq False
True
>>> bool(False is None)
False

我只是不明白為什么會這樣。

解釋

>>> 7 and None
None
>>> bool(None)
False

所以要回答:

  • a and b在您發表評論時給出None不是False
  • bool(a and b)給出False

那么當你用實際值替換a and b

  • 你得到bool(None is None)這是True

我相信你有bool(bool(a and b) is None) ,這會給False

Python's and實際上返回測試的最后一個值。 對於x and y ,如果x為假,則返回x 如果x為真,它將返回y 例如:

>>> 0 and ''
0
>>> 0 and 'x'
0
>>> 1 and ''
''
>>> 1 and 'x'
'x'

所以當你做a and b ,你會得到None

來源: 文檔:布爾運算——和、或、非

考慮以下兩個事實:

  1. None是假的
  2. 如果兩個變量都為真and返回真。

在每一個誤導你的案例中,你都沒有考慮這些事實。

由於其__bool__魔術方法,所有 Python 內置函數和大多數實例都具有隱含的真值。 在您的情況下,您正在使用intNone的內置類型。 在純 python 中, int__bool__方法類似於以下內容:

class int(object):
...
    def __bool__(self):
        return self != 0 # True as long as not equal to 0
...

對於None ,它將是以下內容:

class NoneType(object):
    ...
    def __bool__(self):
        return False # Always False
    ...

每當執行需要將變量視為布爾值( andornotbool轉換)的操作時,這些__bool__魔術方法用於獲取其對應實例的真值。

因此,考慮到這一點,讓我們一一查看您的表情。

>>> bool(a and b)
False

a是整數7 ,因此通過其__bool__魔術方法,它具有正真值 ( True )。 bNone ,它有一個負真值( False )。 當你在 Python 中and變量,如果第一個and操作數有一個正的真值, and總是返回第二個操作數(相反的行為可以用or看到)。 可以在此處找到有關這方面的更多信息。 因此,當您執行a and b ,將返回None因為a具有正真值。 結果None然后被轉換為一個bool ,如上面None__bool__方法所示,將是False

>>> bool((a is None) and (b is None))
False

這評估為 False 因為a不是None 在這里,由於您在語句中使用is ,因此您不是在比較真值,而是在檢查它們是否是同一個對象。 由於7None不是同一個實例,因此結果為False ,導致語句的其余部分計算為False

>>> bool((a and b) is None) # (a and b) eq False (should be None)
True

從第一個開始, a and b將返回None 因為None是同一個實例NoneNone is None的計算結果為True 強制轉換為bool是多余的。

>>> bool(False is None)
False

最后,在這里我們再次檢查FalseNone是否是同一個實例。 由於它們不是,因此計算結果為False並且轉換為bool再次是多余的。

暫無
暫無

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

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