Python学习之路——内存管理

来源:互联网 发布:网络电话卡有哪些 编辑:程序博客网 时间:2024/05/16 16:10

1 变量定义

在Python中,变量定义不像C/C++等语言需要显式声明语句,变量在第一次赋值时自动声明。但和C/C++等语言相同的是:变量只有被创建和赋值后才能被使用。

变量一旦被赋值,你就可以通过变量名来访问她。

>>> x = 4>>> y = 'test string'>>> x4>>> y'test string'>>> 

2 动态类型

Python中不但变量名无需事先声明,而且也无需类型声明。在Python语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python仍然是一种解释型语言。创建对象时,解释器会根据语法和右侧的操作数来决定新对象的类型,在对象创建后(也就是变量赋值),一个该对象的引用会被赋值给左侧的变量。


3 内存分配

Python解释器承担了内存管理的复杂任务,程序员只需要关心要解决的问题,底层的事放心交给Python解释器就行。(真是个好消息)


4 引用计数

Python解释器是如何管理内存的,它是依据什么来决定是否回收这个对象?Python使用了引用计数这一简单技术。Python内部记录着所有使用中的对象各有多少个引用。一个内部跟踪变量,称为一个引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,但这个对象不再使用,这个对象的引用计数变为0时,他就被当作垃圾回收。

4.1 增加引用计数

当对象被创建并(将其引用)赋值给变量, 该对象的引用计数就被设置为1。

当同一个对象的引用又被赋值给其他变量,或作为参数传递给函数、类实例时,或赋值给一个容器对象的成员时,该对象的一个新的引用,就会被创建,该对象的引用计数自动加1.

4.2 减少引用计数

一个对象的引用计数在以下情况下会减少:

  • 一个本地引用离开了其作用范围,例如函数结束了。

  • 对象的一个引用被显式删除

              del    y                 # y为变量

  • 对象的一个引用被赋值给其他对象

              x = 123

              x = 456(对象123的引用计数减1, 456的引用计数加1)

  • 对象从容器对象移除

aList.remove(x)

  • 容器对象被销毁

del aList

4.3 del 语句

del语句会删除对象的一个引用,它的语法如下:

del obj


5 垃圾收集

不再使用的内存会被一种称为垃圾收集的机制释放。解释器负责跟踪对象的引用计数,而垃圾收集器负责释放内存。垃圾收集器是一块独立代码,它用来寻找引用计数为0的对象,它也负责检查那些虽然引用计数大于0但也应该被销毁的对象。


0 0