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

标签 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 可以解释这些比较是如何在内部进行的(或指出我可以找到该信息的方向),我将不胜感激. :-)

提前致谢!

最佳答案

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()

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

关于Python 好奇心 : [] > lambda n: n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864973/

相关文章:

Python 正则表达式插入

python - 字符串拆分有异常

python:如何读取二维动态列表的元素?

ruby-on-rails - 如何将默认参数传递给 Rails lambda/scopes?

java - 结合对象的 ArrayList 并在 Java 中对 BigDecimal 求和

Python win32api.mouse_event 类型错误

python - Pandas 频率/计数 - 新 df 与现有 df 中的新列

c# - 从列表对象的列表字段中删除元素的最佳方法

c# - 如何创建从反射获得的类型列表

java - Java lambda 表达式语法的清晰度 - 省略参数数据类型