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,但也该被收集,垃圾收集器当然也负责处理这些该被销毁的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值