深入理解Python None對象,正確判斷對象是否為空


********************************************************************

*****摘自<編寫高質量代碼 改善Python程序的91個建議>*****

********************************************************************

  在學習Python的過程中,是否寫過如下代碼來判斷變量a是否為空:

1 if a is not None:   #   value is not empty
2     Do Something
3 
4 else:               #   value is empty
5     Do Some other thing

  那么這樣寫有什么問題嗎?

  先了解一下Python中哪些形式的數據為空。

  • 常量None
  • 常量False
  • 任何形式的數值類型零,如0、0L、0.0、0j
  • 空的序列,如""、[]、()
  • 空的字典,如{}
  • 當用戶定義的類中定義了__nonzero__()方法和__len__()方法,並且該方法返回整數0或者布爾值False的時候

  其中,常量None的特殊性體現在它既不是0、False,也不是空字符串,它就是一個空值對象。其數據類型為NoneType,遵循單例模式,是唯一的,因此不能創建None對象。所有賦值為None的變量都相等,並且None與任務其他非None的對象比較結果都為Flase。

 1 >>> id(None)
 2 10302688
 3 >>> None == 0    #  None不為0
 4 False
 5 >>> None == False  #  None也不是False
 6 False
 7 >>> None == ""    #  None更不是空字符串
 8 False  
 9 >>> a = None
10 >>> id(a)
11 10302688
12 >>> b = None
13 >>> id(b)
14 10302688
15 >>> a == b      #  任何賦值為None的對象都相同
16 True
17 >>> list1 = []
18 >>> if list1 is not None:
19 ...     print("list is: %s" % list1)
20 ... else:
21 ...     print("list is empty")
22 ... 
23 list is: []
24 >>> 

  上面的例子中,對列表是否為空的判斷顯然不符合我們的要求,因為除非a被賦值為None,否則else中的語句永遠不會被執行。正確的形式如下:

1 >>> if list1:    # value is not empyt, 判定list1是否為空的正確方式
2 ...     print("list is:{0}".format(list1))
3 ... else:      # value is empty
4 ...     print("list is empty")
5 ... 
6 list is empty
7 >>> 

  if list1執行時會調用內部方法__nonzero__()來判定變量list1是否為空並返回其結果。

  __nonzero__():該內部方法用於對自身對象進行空值測試,返回0/1或True/False。如果一個對象沒有定義該方法,則獲取__len__()的返回結果來進行判斷;

  __len__():該內部方法的返回值為0則表示為空;

  如果一個對象既沒有定義__nonzero__()方法,也沒有定義__len__()方法,該類的實例用if判定的結果都為True


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM