Python中绑定的函数对象标识

时间:2015-07-07 17:34:59

标签: python equality

这一点Python让我感到困惑。

class my_class(object):
    def f():
        return 1
c = my_class()
f1 = c.f
f2 = c.f
assert not f1 is f2
assert id(f1) != id(f2)
assert f1 == f2

所有三个断言都通过了。前两个是相同的,但我希望两者都失败。

这对我来说似乎很奇怪。当我调用c.f时,Python是否真的创建了新的,绑定的成员函数对象?为什么会这样做?

好的 - 看here,我想我的第一个问题的答案是肯定的。但是,在这种情况下,这种具有一致==的不同ID的业务似乎完全是奇怪的。对于容器,当然,我想要is==之间的分歧(即包含等效数据的两个不同的容器对象)。但对于成员函数,似乎is==应该是等价的。

有人可以为我激励这一点Python设计吗?

编辑:经过进一步的反思,这对我来说是有意义的。为了使对象的内存占用量很小,必须根据请求创建绑定函数,因此每个请求都是不同的对象。

0 个答案:

没有答案