2

我的一位同事正在使用内置的max函数(在 Python 2.7 上),他发现了一个奇怪的行为。

错误地,他没有使用关键字参数key(如key=lambda n: n)对作为参数传递的列表进行预排序,而是:

 >>> max([1,2,3,3], lambda n : n)
[1, 2, 3, 3]

他正在做文档中解释为:

如果提供了两个或更多位置参数,则返回最大的位置参数。,所以现在我很好奇为什么会发生这种情况:

>>> (lambda n:n) < []
True
>>> def hello():
...     pass
... 
>>> hello < []
True
>>> len(hello)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'function' has no len()

我知道这没什么大不了的,但是如果有任何stackoverflowers可以解释这些比较是如何在内部进行的(或者指出我可以找到该信息的方向),我将不胜感激。:-)

先感谢您!

4

2 回答 2

7

Python 2 相当随意地对不同类型的对象进行排序。它这样做是为了使列表始终可排序,无论内容如何。比较的结果是哪个方向并不重要,只是那个总是赢。碰巧的是,C 实现回退到比较类型名称。lambda的类型名称是function,它在前面排序list

在 Python 3 中,您的代码会引发异常:

>>> (lambda n: n) < []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: function() < list()

因为,正如您所发现的,支持任意比较通常会导致难以破解的错误。

于 2013-07-25T17:37:20.097 回答
6

Python (2) 中的所有内容都可以进行比较,但正如您所见,有些是相当荒谬的。

>>> (lambda n:n) < []
True

Python 3 解决了这个问题,并产生了异常。

于 2013-07-25T17:38:04.517 回答