Python是如何比较函数的?

30 投票
2 回答
18424 浏览
提问于 2025-04-17 05:16

为什么这个不会出现属性错误呢?因为函数对象没有任何比较的方法。它是不是用到了 id() 呢?

fun1 = lambda:x
fun2 = lambda:x
print fun1 == fun1 # True
print fun1 == fun2 # False
print fun1 > fun2 # True
print fun1 < fun2 # False
print fun1 > 1 # True

我明白它是在比较地址,但具体是怎么做到的呢?这是不是某种低级的技巧,用来拦截 __lt__、__eq__ 等方法?

2 个回答

9

__eq____lt__等这些东西在Python里并不是用来真正实现比较的,它们只是让你可以自定义比较的方式。

根据Python语言参考的说法:

大多数内置类型的对象在比较时,如果不是同一个对象,通常会被认为是不相等的;至于一个对象被认为比另一个对象小还是大,这个选择是随意的,但在程序的一次执行中是保持一致的。

可能是通过比较对象的ID来实现这个功能,但语言本身并没有明确说明。

我不太明白为什么要让任何对象都能和其他对象比较,不过这是语言的一个内置特性——参考文献提到这让任何列表都可以排序,这样比较两个字典就变得简单了。

24

函数对象并没有自己定义比较的方法,也就是说,它们不能直接进行大小比较。相反,它们是从类型对象那里继承来的,而这些类型对象实现了基于对象在内存中地址的比较方式。

所以,实际上它们使用的是内存地址,就像内置的 id() 函数一样。

在 Python 3 中,函数不再可以进行排序比较了。

撰写回答