您的位置:首页 > 编程语言 > Python开发

python的内存管理

2015-09-17 19:58 363 查看
Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。如图所示(图片来自Python核心编程)




x = 3.14

y = x

我们首先创建了一个对象3.14, 然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,因此,这个浮点数对象的引用计数为1. 语句y = x创建了一个指向同一个对象的引用别名y,我们发现,并没有为Y创建一个新的对象,而是将Y也指向了x指向的浮点数对象,使其引用计数为2.

我们可以很容易就证明上述的观点:



变量a 和 变量b的id一致(我们可以将id值想象为C中变量的指针).

我们援引另一个网址的图片来说明问题:对于C语言来讲,我们创建一个变量A时就会为为该变量申请一个内存空间,并将变量值 放入该空间中,当将该变量赋给另一变量B时会为B申请一个新的内存空间,并将变量值放入到B的内存空间中,这也是为什么A和B的指针不一致的原因。如图:





int A = 1 int A = 2

而Python的情况却不一样,实际上,Python的处理方式和Javascript有点类似,如图所示,变量更像是附在对象上的标签(和引用的定义类似)。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。







a = 1 a = 2 b = a

# True
a = 1
b = 1
print(a is b)

# True
a = "good"
b = "good"
print(a is b)

# True
a = "very good morning"
b = "very good morning"
print(a is b)

# False
a = []
b = []
print(a is b)


可以看到,由于Python缓存了整数和字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。即使使用赋值语句,也只是创造了新的引用,而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。

#36205432
#36205432
a = {'chen':1,'duo':2}
b = a
print id(a)
print id(b)

#36205432
#36205432
a['chen'] = 5
print id(a)
print id(b)

#42284712
#36205432
a = {'chen':1,'duo':2}
print id(a)
print id(b)
由此可见,当对象本身变化时,引用随之变化,但内存地址不变。对象有多个引用时,一个引用与对象关系的改变并不影响这个对象的其他引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: