浅谈 Python 中的比较运算符

2019-12-12 15:49:38 浏览数 (1)

前段时间看到一篇《Flask 开发团队内部 Python 编码风格指南》[1] ,里面有一段关于比较的规范:
  • 任意类型之间的比较,使用 ==!=
  • 与单例(singletons)进行比较时,使用 isis not
  • 永远不要与 TrueFalse 进行比较(例如,不要这样写:foo == False,而应该这样写:not foo

自己在写代码的时候很少去关注变量的比较要如何实现,基本都是直接使用 == 。今天就借此机会聊聊 Python 中的比较运算符。

== 与 !=

==!=等值校验

这两个运算符是我们最熟悉不过的比较运算符了。== 会根据魔术方法 __eq__ 检测左右两侧对象的是否相等。

例如 x == y ,其实背后的操作是 x.__eq__(y)

is

is身份校验。它将检测左右两侧是否为同一个对象

同一个对象必须满足:

  1. 值相同
  2. 内存地址相同

因此就不难理解为什么 isis not 用于单例(singletons)比较了。

单例(singletons)是什么?

单例是一种设计模式,应用该模式的类只会生成一个实例。

单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例

  • 如果实例不存在:会创建一个实例
  • 如果实例已存在:会返回这个实例

not

not 是 Python 中的逻辑判断词,常用于布尔型 TrueFalse

代码语言:javascript复制
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

总结

仅对值进行简单比较时可以使用 ==/!= 操作符:

代码语言:javascript复制
a = 1
b = 2
if a == b:
    pass
else:
    pass

is 用于比较单例,例如比较 None

代码语言:javascript复制
if a is None:
    pass

if a is not None:
    pass

如果涉及布尔值 True/False 的判断,使用 not,不要直接与 TrueFalse 比较:

代码语言:javascript复制
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

0 人点赞