- 任意类型之间的比较,使用
==
和!=
- 与单例(singletons)进行比较时,使用
is
和is not
- 永远不要与
True
或False
进行比较(例如,不要这样写:foo == False
,而应该这样写:not foo
)
自己在写代码的时候很少去关注变量的比较要如何实现,基本都是直接使用 ==
。今天就借此机会聊聊 Python 中的比较运算符。
== 与 !=
==
和 !=
是等值校验。
这两个运算符是我们最熟悉不过的比较运算符了。==
会根据魔术方法 __eq__
检测左右两侧对象的值是否相等。
例如 x == y
,其实背后的操作是 x.__eq__(y)
。
is
is
是身份校验。它将检测左右两侧是否为同一个对象。
同一个对象必须满足:
- 值相同
- 内存地址相同
因此就不难理解为什么 is
和 is not
用于单例(singletons)比较了。
单例(singletons)是什么?
单例是一种设计模式,应用该模式的类只会生成一个实例。
单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例:
- 如果实例不存在:会创建一个实例
- 如果实例已存在:会返回这个实例
not
not
是 Python 中的逻辑判断词,常用于布尔型 True
和 False
。
not True -> False
not False -> True
逻辑判断
代码语言:javascript复制a = False
# not a 为 True
if not a:
pass
判断元素是否存在
代码语言:javascript复制a = 100
b = [1, 2, 3]
# 元素 a 是否不在列表 b 中
if a not in b:
pass
总结
仅对值进行简单比较时可以使用 ==
/!=
操作符:
a = 1
b = 2
if a == b:
pass
else:
pass
is
用于比较单例,例如比较 None
:
if a is None:
pass
if a is not None:
pass
如果涉及布尔值 True
/False
的判断,使用 not
,不要直接与 True
或 False
比较:
a = False
b = True
# 正确的写法
if not a:
pass
if b:
pass
# 错误的写法
if a == False:
pass
not
还可以用于判断元素是否在列表/字典中存在。
References
参考资料与扩展阅读
- Python != operation vs “is not”: https://stackoverflow.com/questions/2209755/python-operation-vs-is-not
- Python 魔术方法指南: https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/a-guide-to-pythons-magic-methods.html
文内引用
- [1] 《Flask 开发团队内部 Python 编码风格指南》: https://my.oschina.net/leejun2005/blog/615953