>>> 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