追溯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
。
答案 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>