转载自:http://www.xwy2.com/article.asp?id=109

 

我们知道 C# 中使用字符串驻留(string interning)机制来提高系统性能,可在 Python 中非但字符串有驻留机制,连整数等也拥有同样的待遇。

 

Code
>>>>>> i = 1
>>>>>> i2 = 1

>>>>>>
id(i)
11229288

>>>>>>
id(i2)
11229288

>>>>>>

 

甚至是类成员也同样如此。

 

 

Code
>>>>>> class MyClass:
def __init__
(self):
self.x
= 123



>>>>>> a =
MyClass()
>>>>>> b =
MyClass()
>>>>>>
id(a.x)
11229808

>>>>>>
id(b.x)
11229808

 

继续一个复杂一点的。

 

Code
>>>>>> 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 将简单类型也分配到堆上?

 

Code
>>>>>> import sys
>>>>>> a = 1

>>>>>>
sys.getrefcount(a)
699

>>>>>> b =
a
>>>>>>
sys.getrefcount(a)
700

>>>>>> c = 1

>>>>>>
sys.getrefcount(c)
701

>>>>>>

 

而在 C# 中,显然堆或栈上都不可能如此。

 

Code
unsafe
{
int i
= 1
;
int i2
= 1
;

int
* p1 = &
i;
int
* p2 = &
i2;

Console.WriteLine((int)p1);
Console.WriteLine((int)p2);
}
posted on 2008-09-04 13:23  sislcb  阅读(518)  评论(0编辑  收藏  举报