一个变量如果是None,它一定和None指向同一个内存地址。
None
None是python中的一个常量,它有自己的数据类型NoneType,表示一个空的对象。
None和任何对象比较返回值都是False,除了None本身
数据为空,比如””、{}、()等并不代表空对象。
False
python中判断数据为空的对象时,结果都为False,包括 “” 、[]、 {} 、()、None、 0、False
所以尽可能使用隐式的false, 例如: 使用 if obj: 而不是 if obj != []
if obj: # 判断obj不为空
print('if 执行')
else:
print('else 执行')
⚠️:
(1)不要用==或者!=来比较单例, 比如None. 使用is或者is not.
(2)当你写下 if x: 时, 你其实表示的是 if x is not None . 例如: 当你要测试一个默认值是None的变量或参数是否被设为其它值. 这个值在布尔语义下可能是false!
(3)不要用==将一个布尔量与false相比较. 使用 if not x: 代替
如果需要区分false和None, 应该用 if not x and x is not None
(4)对于序列(字符串, 列表, 元组), 要注意空序列是false. 因此 if not seq: 或者 if seq: 比 if len(seq): 或 if not len(seq): 要更好
is和==
is比较的是两个对象在内存中的地址是否一致,可以比较单例对象
==表示两个对象的值是否相等,相当于调用eq()
和None比较时为什么用is
python中的None是单例对象,一个变量如果是None,它一定和None指向同一个内存地址。
>>> a=None
>>> b=None
>>> id(a)==id(b)
True
is None是判断两个对象在内存中的地址是否一致,== None背后调用的是eq,而eq可以被重载,下面是一个 is not None但 == None的例子
>>> class test():
... def __eq__(self,other):
... return True
...
>>> t=test()
>>> t is None
False
>>> t == None # ==相当于调用__eq__(),eq的返回值始终为True
True