Skip to content

Instantly share code, notes, and snippets.

@atlanmatrix
Last active November 16, 2020 15:39
Show Gist options
  • Save atlanmatrix/18a7a4f368075776760d1a951ce8ca7f to your computer and use it in GitHub Desktop.
Save atlanmatrix/18a7a4f368075776760d1a951ce8ca7f to your computer and use it in GitHub Desktop.
Python 内置类型的比较
内置数值类型 (数字类型 --- int, float, complex) 以及标准库类型 fractions.Fraction 和 decimal.Decimal 可进行类型内部和跨类型的比较,例外限制是复数不支持次序比较。 在类型相关的限制以内,它们会按数学(算法)规则正确进行比较且不会有精度损失。
非数字值 float('NaN') 和 decimal.Decimal('NaN') 属于特例。 任何数字与非数字值的排序比较均返回假值。 还有一个反直觉的结果是非数字值不等于其自身。 举例来说,如果 x = float('NaN') 则 3 < x, x < 3 和 x == x 均为假值,而 x != x 则为真值。 此行为是遵循 IEEE 754 标准的。
None 和 NotImplemented 都是单例对象。 PEP 8 建议单例对象的比较应当总是通过 is 或 is not 而不是等于运算符来进行。
二进制码序列 (bytes 或 bytearray 的实例) 可进行类型内部和跨类型的比较。 它们使用其元素的数字值按字典顺序进行比较。
字符串 (str 的实例) 使用其字符的 Unicode 码位数字值 (内置函数 ord() 的结果) 按字典顺序进行比较。 3
字符串和二进制码序列不能直接比较。
序列 (tuple, list 或 range 的实例) 只可进行类型内部的比较,range 还有一个限制是不支持次序比较。 以上对象的跨类型一致性比较结果将是不相等,跨类型次序比较将引发 TypeError。
序列比较是按字典序对相应元素进行逐个比较。 内置容器通常设定同一对象与其自身是相等的。 这使得它们能跳过同一对象的相等性检测以提升运行效率并保持它们的内部不变性。
内置多项集间的字典序比较规则如下:
两个多项集若要相等,它们必须为相同类型、相同长度,并且每对相应的元素都必须相等(例如,[1,2] == (1,2) 为假值,因为类型不同)。
对于支持次序比较的多项集,排序与其第一个不相等元素的排序相同(例如 [1,2,x] <= [1,2,y] 的值与``x <= y`` 相同)。 如果对应元素不存在,较短的多项集排序在前(例如 [1,2] < [1,2,3] 为真值)。
两个映射 (dict 的实例) 若要相等,必须当且仅当它们具有相同的 (键, 值) 对。 键和值的一致性比较强制规定自反射性。
次序比较 (<, >, <= 和 >=) 将引发 TypeError。
集合 (set 或 frozenset 的实例) 可进行类型内部和跨类型的比较。
它们将比较运算符定义为子集和超集检测。 这类关系没有定义完全排序(例如 {1,2} 和 {2,3} 两个集合不相等,即不为彼此的子集,也不为彼此的超集。 相应地,集合不适宜作为依赖于完全排序的函数的参数(例如如果给出一个集合列表作为 min(), max() 和 sorted() 的输入将产生未定义的结果)。
集合的比较强制规定其元素的自反射性。
大多数其他内置类型没有实现比较方法,因此它们会继承默认的比较行为。
[以下列表描述了最主要内置类型的比较行为](https://docs.python.org/zh-cn/3/reference/expressions.html#value-comparisons:~:text=%E4%BB%A5%E4%B8%8B%E5%88%97%E8%A1%A8%E6%8F%8F%E8%BF%B0%E4%BA%86%E6%9C%80%E4%B8%BB%E8%A6%81%E5%86%85%E7%BD%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%AF%94%E8%BE%83%E8%A1%8C%E4%B8%BA)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment