我已经尝试了一些关于绑定和未绑定方法的代码.当我们调用它们时,我认为它们都会返回对象.但是当我id()用来获取一些信息时,它会返回一些我不理解的东西.
IDE:Eclipse
插件:pydev
Class C(object):
def foo(self):
pass
cobj = C()
print id(C.foo) #1
print id(cobj.foo) #2
a = C.foo
b = cobj.foo
print id(a) #3
print id(b) #4
Run Code Online (Sandbox Code Playgroud)
输出是......
5671672
5671672
5671672
5669368
Run Code Online (Sandbox Code Playgroud)
为什么#1和#2返回相同的ID?它们不是不同的对象吗?如果我们分配C.foo和conj.foo两个变量,#3和#4返回不同的id.
我认为#3和#4表明它们不是同一个对象,但#1和#2 ......
绑定方法的id和未绑定方法有什么区别?
我知道python内置id()函数返回一个对象生命周期唯一的ID.我理解,具有非重叠生命期的对象最终可能具有相同的ID.但是,我试图理解这种相当混乱的行为:
>>> id(matplotlib.image.BboxImage.set_cmap)
4424372944
>>> id(numpy.ma.core.MaskedArray.sum)
4424372944
Run Code Online (Sandbox Code Playgroud)
事实上,跨多个解释器实例,行为是可重复的:
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4343186208 4343186208
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4521153312 4521153312
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4358591264 4358591264
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)"
4389970720 4389970720
Run Code Online (Sandbox Code Playgroud)
看来,matplotlib.image.BboxImage.set_cmap和numpy.ma.core.MaskedArray.sum总是得到相同的ID作为对方,甚至跨越了Python解释器的不同instatiations.
现在我明白这与文档是一致的,id()因为这两个对象在被访问时是动态创建的,因此确实具有非重叠的生命周期.但是为什么这两个不相关的对象总是会使用相同的ID呢?
(这个问题不同于同一类的Object方法有相同的id?因为在这里我问为什么这可以在多个解释器实例中重复,而不是简单地在具有非重叠生命周期的对象上进行虚假的id冲突.)