我有以下脚本:
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(使用前将#替换为@)