为什么对象的id会根据python shell中的行而改变

这个问题只是出于好奇。

在阅读python的对象模型文档时 ,我决定尝试一下使用类方法的id,并发现这种行为:

Python 3.2.2 (default, Sep 4 2011, 09:07:29) [MSC v.1500 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>> class A(): def a(self): pass >>> id(A().a) 54107080 >>> id(A().a) 54108104 >>> id(A().a) 54107080 >>> id(A().a) 54108104 >>> >>> id(A().a) 54108104 >>> >>> id(A().a) 54108104 >>> id(A().a) 54107080 >>> 

该方法的id随着行的奇偶性而改变!

我真的想创build一个同一类的几个实例,看看他们是否有相同的方法对象,我期望他们将是完全相同的,或每次都改变,我没有想到的是方法ID与口译员的行为是否平衡有关! 有任何想法吗?

注:我知道文档和解释器的版本不匹配,只是发生在Windows上,我只安装了3.2

Solutions Collecting From Web of "为什么对象的id会根据python shell中的行而改变"

我会解释一下这个行的id(A().a)

 A() # creates a new object I call a 

然后

 A().a # creates a function f bound to a Aa__get__(A(), A) # same as above >>> Aa__get__(A(), A) <bound method Aa of <__main__.A object at 0x02D85550>> >>> A().a <bound method Aa of <__main__.A object at 0x02D29410>> 

这个绑定函数总是另一个,因为它在__self__有另一个对象

 >>> a = A() >>> assert aa__self__ is a 

__self__将作为第一个self变量传递给函数Aa

编辑:这是它看起来像:

 Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> class A: def a(self): pass >>> id(A().a) 43476312 >>> id(A().a) 49018760 

这里的身份证重复像abab

 Python 3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> class A: def a(self): pas s >>> id(A().a) 50195512 >>> id(A().a) 50195832 >>> id(A().a) 50195512 >>> id(A().a) 50195832 

编辑:对于Linux或什么不是我的机器和任何我不知道

 id(A().a) 

将总是给出相同的结果,除非你把它存储到一个变量。 我不知道为什么,但我会认为这是因为性能优化。 对于堆栈中的对象,每次调用函数时都不需要为对象分配新的空间。