我在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
所以你可以看到这些数字实际上是相同的;只是它在一个地方以十六进制显示,在另一个地方以十进制显示。