分类: Python/Ruby
2010-12-16 13:54:02
>>>>>> i = 1
>>>>>> i2 = 1
>>>>>> id(i)
11229288
>>>>>> id(i2)
11229288
>>>>>>
甚至是类成员也同样如此。
>>>>>> class MyClass:
def __init__(self):
self.x = 123
>>>>>> a = MyClass()
>>>>>> b = MyClass()
>>>>>> id(a.x)
11229808
>>>>>> id(b.x)
11229808
继续一个复杂一点的。
>>>>>> class MyClass1:
i = 123
def __init__(self):
self.x = 1234
>>>>>> class MyClass2:
i = 123
def __init__(self):
self.x = 1234
>>>>>> id(MyClass1.i)
11229808
>>>>>> id(MyClass2.i)
11229808
>>>>>> id(MyClass1().x)
12893924
>>>>>> id(MyClass2().x)
13241836
>>>>>>
即便在不同类型中,也只有实例成员的地址不同。
我们还可以使用如下方式查看引用计数的变化,这是否意味着 Python 将简单类型也分配到堆上?
>>>>>> import sys
>>>>>> a = 1
>>>>>> sys.getrefcount(a)
699
>>>>>> b = a
>>>>>> sys.getrefcount(a)
700
>>>>>> c = 1
>>>>>> sys.getrefcount(c)
701
>>>>>>
而在 C# 中,显然堆或栈上都不可能如此。