WEB开发网
开发学院软件开发Python [Python 学习笔记] 4: 对象驻留 阅读

[Python 学习笔记] 4: 对象驻留

 2009-10-13 00:00:00 来源:WEB开发网   
核心提示:我们知道 C# 中使用字符串驻留(string interning)机制来提高系统性能,可在 Python 中非但字符串有驻留机制,[Python 学习笔记] 4: 对象驻留,连整数等也拥有同样的待遇,>>>i=1>>>i2=1>>>id(i)11228592>

我们知道 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);
}

输出结果自然不同。

Tags:Python 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接