[Python 学习笔记] 4: 对象驻留
2009-10-13 00:00:00 来源:WEB开发网我们知道 C# 中使用字符串驻留(string interning)机制来提高系统性能,可在 Python 中非但字符串有驻留机制,连整数等也拥有同样的待遇。
>>> i = 1
>>> i2 = 1
>>> id(i)
11228592
>>> id(i2)
11228592
甚至是类成员也同样如此。
>>> class Class1:
def __init__(self):
self.x = 123
>>> a = Class1()
>>> b = Class1()
>>> id(a.x)
11229112
>>> id(b.x)
11229112
继续一个复杂一点的。
>>> class Class1:
i = 123
def __init__(self):
self.x = 1234
>>> class Class2:
i = 123
def __init__(self):
self.x = 1234
>>> id(Class1.i)
11229112
>>> id(Class2.i)
11229112
>>> id(Class1().x)
12302192
>>> id(Class2().x)
12302216
即便在不同类型中,也只有实例成员的地址不同。
我们还可以使用如下方式查看引用计数的变化,这是否意味着 Python 将简单类型也分配到堆上?
>>> import sys
>>> a = 1
>>> sys.getrefcount(a)
530
>>> b = a
>>> sys.getrefcount(a)
531
>>> c = 1
>>> sys.getrefcount(a)
532
而在 C# 中,显然堆或栈上都不可能如此。
unsafe
{
int i = 1;
int i2 = 1;
int* p1 = &i;
int* p2 = &i2;
Console.WriteLine((int)p1);
Console.WriteLine((int)p2);
}
输出结果自然不同。
更多精彩
赞助商链接