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


↙↙↙阅读原文可查看相关链接,并与作者交流