Python的内存管理
学习一门语言前,肯定是先学习这门语言的变量。要想深入了解这门语言,变量在内存中的管理尤其重要。
Python中变量的定义和声明是很随意的,你可以在任何你想要开始使用变量的时候去定义吧,这和C有区别。而且声明变量的时候无需指定变量类型,它的类型会在变量赋值的时候由Python内部的解释器确定。注意,Python变量也需要遵循先创建赋值之后才可以使用的原则。
作为一个优秀的程序,相信我们一定会仔细研究一门语言的变量在内存中是如何管理的,是否需要我们手动释放内存?很幸运的是,Python解释器已经帮我们解决了这个复杂的问题。那它是怎么做的什么时候回收那些对象呢?
Python引入了一个机制:引用计数。引用计数的意思就是说Python内部记录了对象有多少个引用。
引用计数增加情况
比如下面的语句:
x=4 y=x
变量x被创建赋值为4的时候,该对象的引用计数为1。当执行y=x语句的时候,变量y指向了跟变量x同一个对象,这时该对象的引用计数变成了2。
总结一下对象会在一下情况下引用计数加1:
1.对象被创建:x=4
2.另外的别人被创建:y=x
3.被作为参数传递给函数:foo(x)
4.作为容器对象的一个元素:a=[1,x,'33']
引用计数减少情况
1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
2.对象的别名被显式的销毁:del x ;或者del y
3.对象的一个别名被赋值给其他对象:x=789
4.对象从一个窗口对象中移除:myList.remove(x)
5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。
垃圾回收
当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。