关于实例方法上 id 的行为

2024-03-12

我有以下脚本:

class A(object):
    def f(self):
        pass

a = A()
b = A()
print map(id, [A.f, a.f, b.f])
print map(id, [a.f, b.f]) 

Out:

[4299312976, 4298026672, 4299370816]
[4299312976, 4298026672]
  • 为什么id of A.f成为id of a.f?
  • 为什么id of a.f成为id of b.f?

现在我这样做:

print "{0} {1} {2}".format(id(A.f), id(a.f), id(b.f))

Out:

4299312976 4299312976 4299312976

为什么他们有相同的id now?


当您访问A.f创建一个对象,其类型为<unbound method>。您可以看到这种情况:

print map(id, [A.f, A.f, A.f])

哪里的id值不会一样。同样的情况也发生在a.f and b.f但在这种情况下,类型是<bound method>因为对象会记住代码需要对哪个实例执行操作。

一旦您不再引用这些对象,它们就会被垃圾回收。所以:

map(id, [A.f, a.f, b.f])

创建 3 个对象(4 个包括包含它们的列表)并将它们传递给函数id。一旦map调用被终止列表,对象被收集并释放内存。

在第二次调用中创建新对象,并为创建的对象分配内存A.f已被重用(因此你得到相同的id).

在你调用的最后一个例子中id每次显式地访问一个立即被丢弃的对象,并且内存恰好被立即重用。

访问方法时发生这种明显“神奇”的对象创建是因为描述符 https://docs.python.org/2/howto/descriptor.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于实例方法上 id 的行为 的相关文章

随机推荐