【问题标题】:Why does python max('a', 5) return the string value?为什么 python max('a', 5) 返回字符串值?
【发布时间】:2025-12-13 14:25:03
【问题描述】:

追溯一个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

【问题讨论】:

标签: python max min


【解决方案1】:

在 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,如果你真的想要他们回来的话。

【讨论】:

  • 我不是反对者,但不是“数值总是排在其他类型之前”是真的——试试sorted(None, 23]),你会经常看到None 首先,即使它不是数字类型。它,或者更确切地说是曾经一旦Py2成为历史,一个真正任意的决定
  • @AlexMartelli:没有一个是唯一的例外;但是,我不想列出完整的规则。我将链接到我确实深入的答案。确实,这些选择曾经是武断的,但由于它们从那以后就没有改变过,现在却是一成不变的。 :-)
  • @AlexMartelli:调整了开头句中糟糕的措辞。
  • 很好,但是您可以通过指定numbers 来使这两个答案变得更好987654338@!-),但它不会让你对它们进行排序:-)。
  • @AlexMartelli:哦,试图简洁的危险。 datetime 对象在排序时也不会播放,无论如何都不会播放其他类型。可能还有其他一些例外。
【解决方案2】:

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

OTOH,我不明白为什么您认为 5“明显”大于“a”... 不同类型的值是可比较的,只是为了方便(例如,如果您正在使用所需的等生键构建 RB 树一切都可以比较),并且这样的比较确实定义了严格的弱排序,但是类型间比较并不打算以任何方式是明智的(你如何将数字与字符串或对象进行比较?),只是连贯的。

【讨论】: