那些年,走過的 None 之坑

前言

今天的主角是 Python 中的 None,那些年,我們一起走過的 None 之坑。

說到 None ,與之對應的中文,第一個想到的就是空。在任何程序中,總會有著空伴你左右,下面就來聊一聊 Python 中的空!

Python 中的 None

一提到 None,是不是有人會想到我們平時的空字符串,空列表。又或者是 0 , False 這樣的值?在寫 if 判斷時,我們想要判斷一個字符串是不是空,你會不會這樣寫:

a = ''
if a is None:
print('a 字符串 is None 返回結果是 True')

猜一猜輸出結果會打印嗎?

如果你覺得會打印輸出的同學,怕是要打臉了.....請務必好好看下今天這篇 None 的技巧文章!因為在 Python 中 None 並不等於以上說的這些!

不等於的前提下,是從 Python 的 id值(內存地址),類型,值 三點出發考慮的,讓我們場景帶入看看....

場景帶入與代碼實現

動手實踐是最好的證明方法,寫一段代碼來驗證下!

需求場景很簡單,有個空字符串a,有個空列表b,還有個等於0的c,最後再來一個等於 False 的d。

先來驗證值相等不相等,不知道大家還記不記得如何判斷值相不相等呢?之前在 Python 小課堂基礎章節介紹過,使用 == 即可判斷值是否相等,返回的結果是個 bool 類型的結果,True 說明值相等,False 說明值不相等。

再來使用 is 驗證內存地址,類型,值是否一致。

忘了的回顧文章:python小課堂12 - 運算符篇

具體場景代碼如下:

a = ''
b = []
c = 0
d = False

# 值是否相等
print(a == None)
print(b == None)
print(c == None)
print(d == None)

# id值(內存地址)是否相等
print(a is None)
print(b is None)
print(c is None)
print(d is None)
python小課堂35 - 那些年,走過的 None 之坑

打印結果全部都是 False,說明不論是上面試的哪種空類型,都不等於 None,不論使用 == 或者 is 來進行判斷。

None與各種空值不等的原因

要說 None 與上述各種空值不等的原因,其實也很簡單。大家是否還記得一句話,在 Python 中,一切萬物皆為對象!這意味著,None 自身就是個對象,曾經在小課堂的對象篇介紹過,對象可以理解為類型。

具體回顧文章:python小課堂18 - 面向對象篇(一)

使用 type() 內置函數,可以看到一個對象的類型是什麼。

python小課堂35 - 那些年,走過的 None 之坑

打印結果為 NoneType ,這邊是 None 關鍵字的類型了。所以使用 is 判斷 空字符串,空列表等 與 None 是否相等,單從類型上來說,返回結果就是 False 了!

在 if 判斷中,None 踩過的坑

來,請大家看一個深坑,下面這段代碼從邏輯思維上來講是有些繞的,不過筆者已經將正確的邏輯用中文的形式寫在了 print 打印結果中,思考一下,看看會打印出什麼呢?

坑一,a變量以函數進行返回 None :

def function_a():
return None


a = function_a()

# not + 變量 進行判空, if not ,
if not a:
print('if not a , 返回結果是 True! 中文意思是如果 a 是空值!')
else:
print('if not a , 返回結果是 False! 中文意思是如果 a 是不空值!')

# 變量 is None 進行判空
if a is None:
print('if a is None 返回結果是 True! 中文意思是如果 a 是空值!')
else:
print('if a is None 返回結果是 False! 中文意思是如果 a 是不空值!')

坑二,變量 a 直接賦值空字符串:

a = ''
# not + 變量 進行判空, if not ,
if not a:
print('if not a , 返回結果是 True! 中文意思是如果 a 是空值!')
else:
print('if not a , 返回結果是 False! 中文意思是如果 a 是不空值!')

# 變量 is None 進行判空
if a is None:
print('if a is None 返回結果是 True! 中文意思是如果 a 是空值!')
else:
print('if a is None 返回結果是 False! 中文意思是如果 a 是不空值!')

上面這兩段代碼,希望大家可以在留言區進行自己的看法輸出,歡迎留言,如果你真的看懂了本文的介紹,相信這兩段代碼很容易得出答案!

PS:多說一句,輸出是一個動腦子的過程,單單是看文章,不一定是真的看明白了,好多人關注了系列文章,相信都是想去主動學習的讀者,學習如何牢固,輸入->思考->輸出。

Pythonic 寫法式判空

提倡 Pythonic ,說白了就是簡潔性的 Python 代碼。判空其實很容易,如下:

a = ''
if a:
print('a 是有值的!非空')
else:
print('a 是空值!')
python小課堂35 - 那些年,走過的 None 之坑

結論: 在 Python 中,多數以 "if 變量:" 形式進行判空操作!

if 變量:

文章首發公眾號,感興趣的同學歡迎關注:migezantan.(咪哥雜談) 


分享到:


相關文章: