python内存动态分配过程详解


Posted in Python onJuly 15, 2019

一、前言

大多数编译型语言,变量在使用前必须先声明,其中C语言更加苛刻:变量声明必须位于代码块最开始,且在任何其他语句之前。其他语言,想C++和java,允许“随时随地”声明变量,比如,变量声明可以在代码块的中间,不过仍然必须在变量被使用前声明变量的名字和类型。

在Python中,无序此类显式变量声明语句,变量在第一次被赋值时自动声明。和其他大多数语言一样,变量只有被创建和赋值后才能被使用。

# 变量未声明
>>> x
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

#变量一旦被赋值,就可以通过变量名来访问它

>>> x=1
>>> y="It's wonderful."
>>> x
1
>>> y
"It's wonderful."

二、动态类型

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

三、内存分配

作为一个负责任的程序员,我们知道在为变量分配内存时,是在借用系统资源,在用完之后,应该释放借用的系统资源。Python解释器承担了内存管理的复杂任务,这大大简化了应用程序的编写。

3.1 引用计数

要保持追踪内存中的对象,Python使用了引用计数这一简单技术。也就是说Python内部记录着所有使用中的对象 各有多少引用。一个内部跟踪变量,称为引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。(并不是100%这样)

3.2 增加引用计数

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

 当同一个变量又被赋值给其他变量时,或作为参数传递给函数、方法或类实例,或者被赋值为一个窗口对象的成员时,该对象的一个新的引用,或者称为别名,就被创建(则该对象的引用计数就自动加1)。

如下代码:

>>> x = 3
>>> y = x

python内存动态分配过程详解

语句x=3我们将3赋值给x。x是第一个引用,因此,该对象的引用计数被设置为1。语句y=x创建了一个指向同一对象的别名y。事实上并没有为y创建一个新的对象,而是该对象的引用计数增加了一次(变成了2)。这是对象引用计数增加的方式之一。还有一些其他的方式也能增加对象的引用计数,比如该对象作为参数被函数调用或这个对象被加入到某个列表等对象当中。

总之,对象的引用计数增加是:

  • 对象被创建  x = 3
  • 另外的别名被创建  y = x
  • 作为参数传递给函数  foo(x)
  • 成为容器对象的一部分  mylist = [1,2,x,'xyz']

3.3 减少引用计数

当对象的引用被销毁时,引用计数会减小。最明显的例子就是当引用离开其作用范围时,这种情况最经常出现在函数运行结束时,所有的局部变量都被自动销毁,对象的引用计数也就随之减少。

当变量被赋值给另外一个对象时,原对象的引用计数也会自动减1:

>>> foo = 'xyz'
 >>> bar = foo
 >>> foo = 123

当字符串对象“xyz”被创建并赋值给foo时,它的引用计数是1。当增加一个别名bar时,引用计数变成了2。不过当foo被重新赋值给整型对象123时,xyz对象的引用计数自动减1,又重新变成了1。

其他造成对象引用计数减少的方式包括使用del语句删除一个变量,或者当一个对象被移出一个窗口对象时。

对象引用计数减少的情况:

  • 一个本地引用离开了其作用的范围。比如foo() 函数结束时。
  • 对象别名被显式销毁  del y
  • 对象的一个别名被赋值给其他对象  x = 123
  • 对象被从一个窗口对象中移除  mylist.remove(x)
  • 窗口对象本身被销毁  del mylist

四、垃圾收集

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中的map、reduce和filter浅析
Apr 26 Python
python套接字流重定向实例汇总
Mar 03 Python
Python如何生成树形图案
Jan 03 Python
Python实现的特征提取操作示例
Dec 03 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
Python如何用filter函数筛选数据
Mar 05 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
使用Python封装excel操作指南
Jan 29 Python
python实现动态数组的示例代码
Jul 15 #Python
python移位运算的实现
Jul 15 #Python
python与C、C++混编的四种方式(小结)
Jul 15 #Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 #Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 #Python
Python将文字转成语音并读出来的实例详解
Jul 15 #Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 #Python
You might like
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
js 页面输出值
2008/11/30 Javascript
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python if语句知识点用法总结
2018/06/10 Python
Python中函数参数调用方式分析
2018/08/09 Python
Python字典遍历操作实例小结
2019/03/05 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
《跨越百年的美丽》教学反思
2014/02/11 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技