为什么python max(' a',5)返回字符串值?

时间:2015-02-01 01:34:24

标签: python max min

追溯ValueError: cannot convert float NaN to integer我发现了一行:

max('a', 5)
max(5, 'a')

将返回a而不是5。

在上面的例子中,我使用了示例字符串a,但在我的实际情况中,字符串是NaN(无法收敛的拟合过程的结果)。

这种行为背后的理由是什么?为什么python不会自动识别出那里有一个字符串并且它应该返回该数字?

更奇怪的是min() 按预期工作

min('a', 5)
min(5, 'a')

返回5

2 个答案:

答案 0 :(得分:12)

在Python 2中,数值总是在字符串和几乎所有其他类型之前排序:

>>> sorted(['a', 5])
[5, 'a']

然后,数字被认为比字符串更小。使用max()时,表示字符串被选中。

这些数字较小是一个任意的实现选择。请参阅Comparisons documentation

  

运算符<>==>=<=!=比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为通用类型。 否则,不同类型的对象总是比较不相等,并且一致但是任意排序。

大胆强调我的。

Python 2试图让异构类型排序很难,这导致了许多难以调试的问题,例如程序员试图将整数与字符串进行比较并获得意外结果。 Python 3纠正了这个错误;您将获得TypeError代替:

>>> max(5, 'a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()

written elsewhere about the ordering rules,甚至是re-implemented the Python 2 rules for Python 3,如果你真的想要那些回来。

答案 1 :(得分:2)

在CPython 2.x中,字符串总是大于数字,这就是你看到这些行为的原因。

OTOH,我不明白为什么你认为5“显然”大于“a”...不同类型的值只是为了方便而具有可比性(例如,如果你正在用你想要的异构密钥构建一个RB树一切都是可比较的),这样的比较确实定义了严格的弱排序,但是类型间的比较并不是以任何方式合理的(你如何将数字与字符串或对象进行比较?),只是连贯的。 / p>