python弱引用的repr中的第二个数字是什么?



我在Windows7上运行python 2.7。

在下面,为什么弱引用表示中的第二个数字与id(f)不同?

import weakref
class Foo(object):
    pass
f = Foo()
w = weakref.ref(f)
print("id(f): %s"%(id(f),))
print("w: %s"%(w,))
>>> 36036400
>>> w: <weakref at 022649F0; to 'Foo' at 0225DF30>

既然是说弱引用指的是Foo"at 0225DF30",我本来会认为这个数字将是f的地址,在CPython中应该与id相同。

整数36036400与十六进制0x225df30相同:

In [10]: hex(36036400)
Out[10]: '0x225df30'
In [11]: 36036400 == 0x225df30
Out[11]: True

您可以使用%x来查看id(f)的十六进制表示形式:

In [12]: print("id(f): %x"%(36036400,))
id(f): 225df30

您似乎希望id(f)显示与打印f相同的数字。事实并非如此,如以下示例所示:

>>> f
<__main__.Foo object at 0x10929df10>
>>> id(f)
4448706320
>>> w
<weakref at 0x10928cfc8; to 'Foo' at 0x10929df10>
>>> id(w)
4448636872

您的示例中未显示的另一件事是,在 w 的输出中,'Foo'的位置是十六进制的。

>>> print 0x10929df10
4448706320

使用您提供给我们的数字:

>>> print 0x0225DF30
36036400

所以你可以看到这些数字实际上是相同的;只是它在一个地方以十六进制显示,在另一个地方以十进制显示。

最新更新