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

为什么python max(';a';5)返回字符串值?,python,max,min,Python,Max,Min,追溯ValueError:无法将浮点NaN转换为整数我发现行: max('a', 5) max(5, 'a') 将返回a而不是5 在上面的例子中,我使用了示例字符串a,但在我的实际例子中,字符串是aNaN(拟合过程未能收敛的结果) 这种行为背后的理由是什么?为什么python不能自动识别那里有一个字符串,并且它应该返回数字 更奇怪的是,min()确实能按预期工作,因为: min('a', 5) min(5, 'a') 返回5在Python 2中,数值总是在字符串和几乎所有其他类型之前排序:

追溯
ValueError:无法将浮点NaN转换为整数
我发现行:

max('a', 5)
max(5, 'a')
将返回a而不是5

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

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

更奇怪的是,
min()
确实能按预期工作,因为:

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

返回
5

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

>>> sorted(['a', 5])
[5, 'a']
因此,数字被认为比字符串小。当使用
max()
时,这意味着字符串是从一个数字中选取的

数字更小是一种任意的实现选择。见:


CPython 2.x字符串中的运算符
==
=
总是大于数字,这就是为什么您会看到这些行为


奥托,我不明白你为什么认为5“显然”比a大。。。不同类型的值是可比较的,只是为了方便起见(例如,如果您正在构建一个具有不同源键的RB树,您希望所有内容都是可比较的),并且这种比较确实定义了严格的弱排序,但类型间的比较在任何方面都是不合理的(如何将数字与字符串或对象进行比较?),只是前后一致。

相关:可能重复“我不是下一个投票人”,但“数值总是在其他类型之前排序”这一说法是不正确的——例如,尝试
排序(无,23])
,您通常会首先看到
,即使它不是数值类型。它是,或者说曾经是Py2的历史,一个真正的武断decition@AlexMartelli:无是唯一例外;然而,我不想列出所有的规则。我将链接到一个我已经深入研究过的答案。事实上,这些选择曾经是武断的,但自那以后就没有改变,现在已经一成不变了。:-)@AlexMartelli:调整了开头句子中糟糕的措词。很好,但是你可以通过指定
Number
不包括复杂的数字来更好地回答这两个问题——Python认为不是这样,因为
isinstance(1j,numbers.Number)
True
!-),但它无论如何也不会让你对它们进行分类:-)@AlexMartelli:噢,试图简洁的危险<代码>日期时间
对象在排序时也不会播放,其他类型的对象也不会播放。可能还有其他一些例外。
>>> max(5, 'a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()