博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python--内存管理
阅读量:2121 次
发布时间:2019-04-30

本文共 1020 字,大约阅读时间需要 3 分钟。

1. 变量定义

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

a = 4b = "string"

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

2. 动态类型

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

int a = 3;vector
b = {
"asd", "wer"};

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

a = 3b = ["asd", "wer"]

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

3. 内存分配

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

4. 引用计数

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

a = 5b = a

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

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

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

a = 5b = a# 至此,5的引用计数为2b = "Baibai"# 至此,5的引用计数又变回1

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

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

a = 5b = adel bprint(a)print(b)

运行结果:

5NameError: name 'b' is not defined

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

5. 垃圾收集

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

转载地址:http://pvfrf.baihongyu.com/

你可能感兴趣的文章
jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
查看>>
Spring boot Myibatis
查看>>
spring boot(七):springboot+mybatis多数据源最简解决方案
查看>>
Spring Boot 笔记
查看>>
maven下手动导入ojdbc6.jar
查看>>
SpringBoot、MyBatis配置多数据源XML方法
查看>>
SpringBoot配置属性之MQ
查看>>
SpringBoot集成mybatis
查看>>
Shell文本处理三剑客之grep
查看>>
linux查看进程启动时间
查看>>
Linux 基础命令
查看>>
35 个 Java 代码性能优化总结
查看>>
Linux Sed 命令
查看>>
StandardContext 错误
查看>>
如何添加网站favicon.ico图标
查看>>
cvs no such repository 问题
查看>>
MySQL中REGEXP正则表达式
查看>>
服务端UDP双向通信学习资料
查看>>
Mina TCP 编码解码相关资料收集
查看>>
Maven 打包 上传 运行
查看>>