后端开发 \ Python \ Python--内存管理

Python--内存管理

总点击46
简介:大多数的编译型语言,在使用变量前,都需要先对变量进行声明。但是Python不同,变量在第一次被赋值时也就自动声明了。和其他语言一样,变量只有被创建和赋值后,才能使用。比如:

1. 变量定义

大多数的编译型语言,在使用变量前,都需要先对变量进行声明。但是Python不同,变量在第一次被赋值时也就自动声明了。和其他语言一样,变量只有被创建和赋值后,才能使用。比如:

a = 4

b = "string"

a,b是变量名。一旦被赋值,就可以通过变量名访问。


2. 动态类型


Python中变量的类型也无需被声明,解释器会根据赋值运算符右边的值来决定变量的类型。比如,在C++中,我们经常写这样的代码:

int a = 3;

vector<string> b = {"asd","wer"};

但是在Python中,我们可以使用更加简洁的形式:

a = 3

b = ["asd","wer"]

程序运行时,解释器会自动认为a是整型变量,而b是有字符串构成的数组。我个人一直认为Python的1, 2两条特性实在是一个伟大的进步,大大方便了代码的编写。


3. 内存分配


这是Python的又一大进步了,解释器帮助程序员承担了内存管理的复杂任务


4. 引用计数


我们先看下面的这个例子:

a = 5

b = a

程序运行的步骤可以抽象的看做这样:首先建立了一个整形对象5,并将其引用赋值给a,而随后又将这个对象的引用赋值给了b. 也就是说,此时一个对象有了2个别名。


a -> 5 <- b


这种情形,就是说5这个对象的引用计数增加了,变为2次。当然,对象作为参数传递给函数,也会导致引用计数的增加:func(a)

此外,引用次数也会减少,比如变量被赋值给另一个对象:

a = 5

b = a

# 至此,5的引用计数为2

b = "Baibai"

# 至此,5的引用计数又变回1

或者当一个函数执行完,所有的局部变量也会被销毁,这一点跟别的语言没什么差别;


显式的del语句也是用来删除对象的引用的:

a = 5

b = a

del b

print(a)

print(b)

运行结果:

5

NameError: name 'b' is not defined

因为5这个对象的别名b被删除了


5. 垃圾收集


Python中有一块独立的代码,叫做“垃圾收集器”,负责释放不再使用的内存,上面我才说过关于引用计数的概念,那么,通俗理解,垃圾收集器释放的内存就是那些引用计数为0的对象。当然,现实中,可能会出现循环引用的情况,比如两个变量互相引用,这种情况下,引用计数虽然大于0,但也该被收集,垃圾收集器当然也负责处理这些该被销毁的对象。

意见反馈 常见问题 官方微信 返回顶部