[英]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
。
來源: 文檔:布爾運算——和、或、非
考慮以下兩個事實:
None
是假的and
返回真。在每一個誤導你的案例中,你都沒有考慮這些事實。
由於其__bool__
魔術方法,所有 Python 內置函數和大多數實例都具有隱含的真值。 在您的情況下,您正在使用int
和None
的內置類型。 在純 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
...
每當執行需要將變量視為布爾值( and
、 or
、 not
、 bool
轉換)的操作時,這些__bool__
魔術方法用於獲取其對應實例的真值。
因此,考慮到這一點,讓我們一一查看您的表情。
>>> bool(a and b)
False
a
是整數7
,因此通過其__bool__
魔術方法,它具有正真值 ( True
)。 b
是None
,它有一個負真值( 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
,因此您不是在比較真值,而是在檢查它們是否是同一個對象。 由於7
和None
不是同一個實例,因此結果為False
,導致語句的其余部分計算為False
。
>>> bool((a and b) is None) # (a and b) eq False (should be None)
True
從第一個開始, a and b
將返回None
。 因為None
是同一個實例None
, None is None
的計算結果為True
。 強制轉換為bool
是多余的。
>>> bool(False is None)
False
最后,在這里我們再次檢查False
和None
是否是同一個實例。 由於它們不是,因此計算結果為False
並且轉換為bool
再次是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.