我最近很惊讶地发现你可以在 Python 中使用不同类型的参数的 min() 而不会得到 ValueError。
min(3, "blah") ==> 3
min(300, 'zzz') ==> 300
文档对此并不清楚 - 它只是说 min() 采用“最小的参数”。它实际上是如何确定哪个元素最小的?
我最近很惊讶地发现你可以在 Python 中使用不同类型的参数的 min() 而不会得到 ValueError。
min(3, "blah") ==> 3
min(300, 'zzz') ==> 300
文档对此并不清楚 - 它只是说 min() 采用“最小的参数”。它实际上是如何确定哪个元素最小的?
它通过使用通常的规则比较它们来确定这一点。如果对象具有不同的类型并且无法进行合理比较(因为它们都没有实现所需的特殊方法,或者实现不适用于另一个对象的类型),那么它们按类型给出一致的顺序;例如,所有整数都小于所有字符串。试试看:1 < "1"
(顺便说一下,布尔值被实现为整数的子类,并且可以与数字进行比较,因此它们False
将按 0 和True
1 排序。)
它以这种方式实现,因此如果您对包含各种类型的列表进行排序,类似的类型将被一起排序。但是,在 Python 3 之前的版本中,这已更改,您不能再隐式比较不同的类型。
在 Python 2 中,存在对不同类型的值进行任意但可预测的比较。我认为这类似于类型名称的字典比较(ints < floats < strs < tuples )。
根据 Python 的排序定义是正确的:
>>> 3 < "blah"
True
>>> 300 < 'zzz'
True
规则是:
如果两者都是数字,则将它们转换为通用类型。否则,不同类型的对象总是比较不相等,并且顺序一致但任意。