Python中空值判断的正确姿势:None与空对象的区别
本文深入解析Python中空值判断的常见误区与正确方法。重点区分None对象与空字符串、空列表等空值的差异,解释if语句调用__nonzero__和__len__机制的原理。通过代码示例展示如何准确判断函数返回值是否为空,避免初学者常见的逻辑错误。
Python空值判断的常见误区
在实际开发场景中,处理空值是基础且高频的操作。许多初学者在编写条件判断时,容易陷入以下代码陷阱:
if a is None:
do something.else:
do the other thing.
这种写法看似直观,但在Python中往往存在隐患。通常情况下,Python会将以下几类情况视为“空”:
None与空对象的本质区别
None
False
0,0.0,0L
'',(),[],{}
其中,None具有特殊性:它既不代表数值0,也不代表任何数据结构(如列表或字典)的空状态,而是一个独立的空值对象。None的类型为NoneType,且遵循单例模式。
这意味着,在同一个命名空间内,所有的None实际上都指向同一个内存地址的空值对象。
>>> id(None)
1795884240
>>> None == 0
False
>>> None == ''
False
>>> a = None
>>> id(a)
1795884240
>>> a == None
True
因此,上述使用==进行的判断并不符合预期:只有当变量a被显式赋值为None时,表达式a==None才会返回True。
那么,针对Python中更广义的空值判断,应当采用何种方式?
if判断背后的__nonzero__机制
>>> a = '' #这里仅以空字符串为例,其他空值同样适用
>>> if a:
... print 'a is not empty'
... else:
... print 'a is a empty string'
'a is a empty string.'
观察可知,直接使用if a进行判断能得到符合直觉的结果。那么,if a背后的执行机制究竟是怎样的?
当执行if a时,Python首先尝试调用对象a的__nonzero__()方法(在Python 3中为__bool__())来判断其真假,并返回True或False。
若对象未定义__nonzero__()方法,Python会转而调用__len__()方法,若返回值为0则视为空。若对象既未定义__nonzero__也未定义__len__,则if a的结果恒为True。
接下来通过具体代码验证上述机制:
>>>class A(object):
... def __nonzero__(self):
... print 'running on the __nonzero__'
... return True
>>>class B(object):
... def __len__(self):
... print 'running on the __len__'
... return False
>>> a, b = A(), B()
>>>if a:
... print 'Yep'
... else:
... print 'Nop'
running on the __nonzero__
Yep
>>>if b:
... print 'Yep'
... else:
... print 'Nop'
running on the __len__
Nop
内容扩展:
如何判断Python函数返回的是否为空?
首先需要明确“空”的具体含义:是指None,还是指空字符串''?
这里分别进行说明:
None是一个空对象,代表“无”或“未定义”,它不占用数据内容。
而''是一个字符串对象,代表长度为0的空字符串,它依然是一个有效的字符串实例。
如果函数返回None,应使用if None:进行判断(注意:if None永远为False)。
如果返回的是空字符串'',应使用if len('') == 0:进行判断,或直接利用if ''的布尔值为False的特性。
网友经验分享:
可以直接将函数调用置于if语句后作为条件。如果返回值为空(如None或空字符串),判断结果将为False。例如:
函数返回值的空值处理技巧
def test():
return None
if test():
print True
else:
print False
至此,关于Python中空值判断的实例分享结束。更多关于Python空值处理的内容,欢迎查阅本站往期文章或继续浏览后续教程,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













