if a is not None:
#value is not empty
Do something
else:
#value is empty
Do some other thing 那么这样写有什么问题呢?先来了解一下Python中哪些形式的数据为空。Python中以 下数据会当做空来处理:
- 常量
None。 - 常量
False。 - 任何形式的数值类型零,如0、0L、0.0、Oj。
- 空的序列,如
"、()、[] - 空的字典,如
{}。 - 当用户定义的类中定义了
nonzero()方法和len()方法,并且该方法返回整数0或者布尔值False的时候。
其中常量 None 的特殊性体现在它既不是0、 False ,也不是空字符串,它就是 一个空值对象。 其数据类型为 NoneType ,遵循单例模式,是唯一的.因而不能创建 None 对象。 所有陚值为 None 的变量都相等,并且 None 与任何其他非 None 的对象 比较结果都为 False 。
id(None)
94822098947520
None==0
False
None==False
False
None==""
False
a=None
b=None
a==b
True
list1=[]
if list1 is not None:
print("list is :",list1)
else :
print("list is emptey")
list is : []
上面的例子中对列表是否为空的判断显然不符合我们的要求, 因为除非a被赋值为 None ,否则 else 中的语句永远不会被执行。正确的形式如下:
if list1:
#value is not empty
print("Do something")
else:
#value is empty
print("Do some other thing")
Do some other thing
执行过程中会调用内部方法 _nonzero__() 来判断变量 list1 是否为空并返回其结果。
下面介绍一下 _nonzero__() 方法:该内部方法用于对自身对象进行空值测试, 返回0/1 或 True/False 如果一个对象没有定义该方法, Python将获取 _len_() 方法调用的结果来进 行判断 _len_() 返回值为0则表示为空。
如果一个类中既没有定义 _len_() 方法也没有 定义 _nonzero_() 方法,该类的实例用 if 判断的结果都为 True 。
类中实现了 _nonzero_ 方法
class A:
def __nonzero__(self):
print("testing A.__nonzero__()")
return True
def __len__(self):
print ("get length")
return False
语句执行的时候会自动调用 _nonzero_ () 方法
if A():
print ("not empty")
else:
print ("empty")
get length empty