Python的好奇心:[]> lambda n:n

时间:2013-07-25 17:35:50

标签: python list lambda comparison-operators

我的一位同事正在使用内置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 可以解释这些比较是如何在内部进行的(或者指向我可以找到该信息的方向) 。的: - )

提前谢谢!

2 个答案:

答案 0 :(得分:7)

Python 2相当任意地命令不同类型的对象。这样做可以使列表总是可排序,无论内容如何。比较出来的方向实际上并不重要,只有一个总能获胜。碰巧的是,C implementation会回归到比较类型名称; lambda的类型名称为function,在list之前排序。

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

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

因为,正如您所发现的那样,支持任意比较主要导致难以破解的错误。

答案 1 :(得分:6)

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

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

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