Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2147393
  • 博文数量: 333
  • 博客积分: 10161
  • 博客等级: 上将
  • 技术积分: 5238
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-19 08:59
文章分类

全部博文(333)

文章存档

2017年(10)

2014年(2)

2013年(57)

2012年(64)

2011年(76)

2010年(84)

2009年(3)

2008年(37)

分类: Python/Ruby

2010-12-16 13:54:02

我们知道 C# 中使用字符串驻留(string interning)机制来提高系统性能,可在 Python 中非但字符串有驻留机制,连整数等也拥有同样的待遇。
>>>>>> 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# 中,显然堆或栈上都不可能如此。

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

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

Console.WriteLine((int)p1);
Console.WriteLine((int)p2);
}  转载自:
阅读(1535) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~