None
在python中是个神奇的东西,它的含义是空,但是却不等于空字符串、空列表、空元组、也不等于False。可以进行验证:
emptyList = list() # 等于[]
emptyTuple = tuple() # 等于()
emptyString = str() # 等于""
boolVar = False
print(emptyList == None) # 值的比较
print(emptyList is None) # 地址比较
print(emptyTuple == None) # 值的比较
print(emptyTuple is None) # 地址比较
print(emptyString == None) # 值的比较
print(emptyString is None) # 地址比较
print(boolVar == None) # 值的比较
print(boolVar is None) # 地址比较
上面代码的输出全部为False
。
None
是一个单例对象,也就是在程序的生命周期内只能存在一个的对象。每次程序返回None
时,会把地址指向这个单例对象。
def funA():
return None
def funB():
return None
returnValA = funA()
returnValB = funB()
noneVal = None
print(type(None)) # <class 'NoneType'>
print(id(returnValA) == id(returnValB)) # True
print(id(returnValA) == id(noneVal)) # True
print(returnValA is None) # True
print(returnValA == None) # True
可以看到两个函数的返回值都是None
时,他们返回值的地址是一致的。而不管作为函数返回值还是作为变量的None
,他们的地址也是一致的。这就验证了None
是一个单例对象。
Python中进行变量比较有两种方法:==
与is
,二者在含义上有根本的区别
-
==
表示两个变量指向的值是否相同 -
is
表示连个变量指向的地址是否相同,也就是验证id(var1) == id(var2)
而==
是由类对象的__eq__
魔法方法返回值定义的,因此我们可以轻松愚弄==
判定:
class someClass(object):
def __eq__(self, other):
return True # 不管和什么对象比较都返回True
classObj = someClass()
print(classObj == None) # True
print(classObj is None) # False
此时虽然实例对象classObj
并不是None
,但是返回给我们的仍然是True
。
另外,前面已经验证了None
不等于False
,因此在在进行判空操作时,要注意两种常用方式not
和is None
的区别。
但是为什么会有些人认为None
和False
是相同的呢?因为None
在进行向布尔型的显式或者隐式类型转换时,得到的是False
。如下例所示:
if None:
print("None is converted to True")
else:
print("None is converted to False")
这里的分支语句会进入else
,即打印出None is converted to False
。
网友评论