********************************************************************
*****摘自<編寫高質量代碼 改善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