Python入門系列35 - 那些年,走過的 None 之坑
Python入門系列35

那些年,走過的 None 之坑
本篇閱讀時間約為 4 分鐘。
1
前言
后臺有個同學(xué)點播了一首非常好聽的歌曲,筆者聽完后的感想,嗯!歌曲比較襯托學(xué)習(xí)氣氛,靜靜的一首歌送給大家。
今天的主角是 Python 中的 None,那些年,我們一起走過的 None 之坑。
說到 None ,與之對應(yīng)的中文,第一個想到的就是空。在任何程序中,總會有著空伴你左右,下面就來聊一聊 Python 中的空!
2
Python 中的 None
一提到 None,是不是有人會想到我們平時的空字符串,空列表。又或者是 0 , False 這樣的值?在寫 if 判斷時,我們想要判斷一個字符串是不是空,你會不會這樣寫:
a = ''if a is None:print('a 字符串 is None 返回結(jié)果是 True')
猜一猜輸出結(jié)果會打印嗎?
如果你覺得會打印輸出的同學(xué),怕是要打臉了.....請務(wù)必好好看下今天這篇 None 的技巧文章!因為在 Python 中 None 并不等于以上說的這些!
不等于的前提下,是從 Python 的 id值(內(nèi)存地址),類型,值 三點出發(fā)考慮的,讓我們場景帶入看看....
3
場景帶入與代碼實現(xiàn)
動手實踐是最好的證明方法,寫一段代碼來驗證下!
需求場景很簡單,有個空字符串a(chǎn),有個空列表b,還有個等于0的c,最后再來一個等于 False 的d。
先來驗證值相等不相等,不知道大家還記不記得如何判斷值相不相等呢?之前在 Python 小課堂基礎(chǔ)章節(jié)介紹過,使用 == 即可判斷值是否相等,返回的結(jié)果是個 bool 類型的結(jié)果,True 說明值相等,F(xiàn)alse 說明值不相等。
再來使用 is?驗證內(nèi)存地址,類型,值是否一致。
忘了的回顧文章:python小課堂12 - 運算符篇
具體場景代碼如下:
a = ''b = []c = 0d = False# 值是否相等print(a == None)print(b == None)print(c == None)print(d == None)# id值(內(nèi)存地址)是否相等print(a is None)print(b is None)print(c is None)print(d?is?None)

打印結(jié)果全部都是 False,說明不論是上面試的哪種空類型,都不等于 None,不論使用 == 或者 is 來進行判斷。
4
None與各種空值不等的原因
要說 None 與上述各種空值不等的原因,其實也很簡單。大家是否還記得一句話,在 Python 中,一切萬物皆為對象!這意味著,None 自身就是個對象,曾經(jīng)在小課堂的對象篇介紹過,對象可以理解為類型。
具體回顧文章:python小課堂18 - 面向?qū)ο笃ㄒ唬?/a>
使用 type() 內(nèi)置函數(shù),可以看到一個對象的類型是什么。

打印結(jié)果為 NoneType ,這邊是 None 關(guān)鍵字的類型了。所以使用 is 判斷 空字符串,空列表等 與 None 是否相等,單從類型上來說,返回結(jié)果就是 False 了!
5
在 if 判斷中,None 踩過的坑
來,請大家看一個深坑,下面這段代碼從邏輯思維上來講是有些繞的,不過筆者已經(jīng)將正確的邏輯用中文的形式寫在了 print 打印結(jié)果中,思考一下,看看會打印出什么呢?
坑一,a變量以函數(shù)進行返回 None :
def?function_a():return Nonea = function_a()# not + 變量 進行判空, if not ,if not a:print('if not a , 返回結(jié)果是 True! 中文意思是如果 a 是空值!')else:print('if not a , 返回結(jié)果是 False! 中文意思是如果 a 是不空值!')# 變量 is None 進行判空if a is None:print('if a is None 返回結(jié)果是 True! 中文意思是如果 a 是空值!')else:print('if a is None 返回結(jié)果是 False! 中文意思是如果 a 是不空值!')
坑二,變量 a 直接賦值空字符串:
a = ''# not + 變量 進行判空, if not ,if not a:print('if not a , 返回結(jié)果是 True! 中文意思是如果 a 是空值!')else:print('if not a , 返回結(jié)果是 False! 中文意思是如果 a 是不空值!')# 變量 is None 進行判空if a is None:print('if a is None 返回結(jié)果是 True! 中文意思是如果 a 是空值!')else:????print('if a is None 返回結(jié)果是 False! 中文意思是如果 a 是不空值!')
上面這兩段代碼,希望大家可以在留言區(qū)進行自己的看法輸出,歡迎留言,如果你真的看懂了本文的介紹,相信這兩段代碼很容易得出答案!
PS:多說一句,輸出是一個動腦子的過程,單單是看文章,不一定是真的看明白了,好多人關(guān)注了系列文章,相信都是想去主動學(xué)習(xí)的讀者,學(xué)習(xí)如何牢固,輸入->思考->輸出。
6
Pythonic 寫法式判空
提倡 Pythonic ,說白了就是簡潔性的 Python 代碼。判空其實很容易,如下:
a = ''if a:print('a 是有值的!非空')else:print('a 是空值!')

結(jié)論:在 Python 中,多數(shù)以 "if 變量:"?形式進行判空操作!
if 變量:至此完!
你點的每個贊,我都認真當(dāng)成了喜歡