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)
94671214968256
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): # 类中实现了 _nonzero_ 方法
print("testing A.__nonzero__()")
return True
def __len__(self):
print ("get length")
return False
语句执行的时候会自动调用 _nonzero_ ()
方法
if A():# 该语句执行的时候会自动调用_nonzero_ ()方法
print ("not empty")
else:
print ("empty")
get length empty