一个变量如果是None,它一定和None指向同一个内存地址。

None

None是python中的一个常量,它有自己的数据类型NoneType,表示一个空的对象。
None和任何对象比较返回值都是False,除了None本身
数据为空,比如””、{}、()等并不代表空对象。

False

python中判断数据为空的对象时,结果都为False,包括 “” 、[]、 {} 、()、None、 0、False
所以尽可能使用隐式的false, 例如: 使用 if obj: 而不是 if obj != []

  1. if obj: # 判断obj不为空
  2. print('if 执行')
  3. else:
  4. 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指向同一个内存地址。

  1. >>> a=None
  2. >>> b=None
  3. >>> id(a)==id(b)
  4. True

is None是判断两个对象在内存中的地址是否一致,== None背后调用的是eq,而eq可以被重载,下面是一个 is not None但 == None的例子

  1. >>> class test():
  2. ... def __eq__(self,other):
  3. ... return True
  4. ...
  5. >>> t=test()
  6. >>> t is None
  7. False
  8. >>> t == None # ==相当于调用__eq__(),eq的返回值始终为True
  9. True