>>> from env_helper import info; info()
页面更新时间: 2023-12-27 09:25:33
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-16-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
3.8. 深入理解None,正确判断对象是否为空¶
在学习Python的过程中,可能曾经有人写过以下代码用来判断变量a是否为空:
- 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)
9804992
>>> 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。
>>> class A:
>>> def __nonzero__(self): # 类中实现了 _nonzero_ 方法
>>> print("testing A.__nonzero__()")
>>> return True
>>> def __len__(self):
>>> print ("get length")
>>> return False
>>>
>>> if A():# 该语句执行的时候会自动调用_nonzero_ ()方法
>>> print ("not empty")
>>> else:
>>> print ("empty")
get length
empty