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
可以看到,由于Python缓存了整数和字符串,因此每个对象只存有一份。比如,所有整数1的引用都指向同一对象。即使使用赋值语句,也只是创造了新的引用,而不是对象本身。长的字符串和其它对象可以有多个相同的对象,可以使用赋值语句创建出新的对象。
、
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)由此可见,当对象本身变化时,引用随之变化,但内存地址不变。对象有多个引用时,一个引用与对象关系的改变并不影响这个对象的其他引用。
相关文章推荐
- python日积月累之None和设置编码
- 机器学习(1)PLA
- Python 上传和更新函数模块到PyPI
- Python 共享和上传函数模块到PyPI
- ubuntu14.04 安装mod_python
- python 进程相关 (八)
- python生成一组随机数
- python
- 说说Python程序的执行过程
- django1.6 python manage.py collectstatic
- python -- why defined '__new__' and '__init__' all in a class
- python 遍历指定文件夹下的所有文件内容
- myeclipse python插件安装和环境配置(Windows7下)
- python IndentationError:
- ubuntu eclipse Python开发环境配置
- python定时任务调度库_apscheduler的使用(2)
- Flask Excel python操作excel
- python 线程相关 (七)
- Python 创建和发布安装函数模块
- Python 学习(3)---Python标准异常总结