python的super super easy教程 | 垃圾回收 引用计数 深拷贝和浅拷贝
input最好是放在函数外面range(i)表示从0到(i-1)函数的作用:接收一个参数 返回一个参数python的内存管理 (常见的面试题)python的内存机制:以引用计数为主,分代回收,标记清除为辅的垃圾回收方式,以及对小整型进行缓存以及简单字符驻留的内存池机制内存管理:怎么去回收?python是动态类型语言 对象是存储在内存中的实体 a=1000(a是对象名 1000是对象) 对象名只是指向这一对象的引用 引用和对象分离,是动态类型的核心 引用可以随时指向一个新的对象(内存地址会不一样)python的引用计数: a=500 在内存中存储的是一个对象 这个对象包括(引用技术,int,500)引用计数:每个对象维护一个ob_ref字段(引用技术字段),用来记录该对象当前被引用的次数每次新的引用指向该对象时,它的引用计数ob_ref+1每当该对象的引用计数失效,就减1一旦对象的引用技数为0,该对象就被回收(销毁对象),该对象占用的内存就被释放怎么看你的引用计数嘞?from sys import getrefcounta=1000getrefcount(a) 出现的结果是2 实际的结果应该是1因为getrefcount会创建一个临时的指针指向a 于是我们得到的结果比实际的结果多1 d=1000 e=1000 这两个指向的不是同一个对象 d=e=1000 这两个才是同一个对象但是当循环引用时: x=[1] y=[2] x.append(y) y.append(x) getrefcount(x) 结果时3 getrefcount(y) 结果为3 (del为删除引用) del x 引用计数-1 del y 引用计数-1 x和y的引用计数都没有归0 空间不会被释放 但是已经调动不了了 根据引用计数的规律,出现循环引用的情况,内存是无法通过引用计数来释放 这种情况就会造成内存泄漏 内存泄漏:有一部分内存被占用无法释放,进程又无法访问(占着茅坑不拉屎) 内存泄漏会造成内存溢出(内存溢出--OOM:内存不够,程序需要的内存大于系统空闲内存)引用计数优点:简单 实时性缺点:维护引用计数消耗资源循环引用的时候 无法回收垃圾回收: gc机制:效率问题:垃圾回收时,python不能进行其他的任务,大大降低python的工作效率 于是当python运行时,会记录其中分配对象和取消分配对象的次数。 当两者的差值高于某个阈值时,垃圾回收才会启动 import gc print gc.get_threshold() 查看垃圾回收的阈值得到(700,10,10)--》阈值为700 后面两个10表示分代回收三种情况出发垃圾回收: 1.调用gc.collect()手动垃圾回收import gcgc.collect() 进行垃圾回收 2.gc到达阈值的时候 3.程序退出时分代回收:(启用垃圾回收的时候确定扫描哪些对象的)这一策略的基本假设是:存活时间越久的对象,越不可能在后面的程序中变成垃圾。• Python将所有的对象分为0,1,2三代。• 所有的新建对象都是0代对象。• 当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。• 垃圾回收启动时,一定会扫描所有的0代对象。• 如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。• 当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描(后面两个10 代表0代经历10次之后才扫1代 1代经历10次之后才扫2代)标记清除:(主要解决循环引用的)标记-清除机制,顾名思义,首先标记对象(垃圾检测),然后清除垃圾(垃圾回收)。主要用于解决循环引用。1. 标记:活动(有被引用), 非活动(可被删除)2. 清除:清除所有非活动的对象内存池机制:内存池,预先创建好一个整型池 [-5,256]字符串驻留区:字符串没有特殊字符且长度不是特别大的情况 或者单个字符的情况下,会存放在字符串驻留区如果多个字符且有特殊字符的情况下就不会放在字符串驻留区str1="abc"或者“#”getrefcount(str1) 输出为2str2="abc"或者“#”getrefcount(str1) 输出为3说明两个的id都是一样的str1=“123@123”str2=“123@123”这2个的id地址一样深拷贝和浅拷贝:(不属于内存管理) (容器包容器的情况且里面是是可变数据类型的情况才有影响) 只会发生在容器类型里面包含其他可变容器类型的情况 浅拷贝可能会造成修改拷贝之后的值(内层容器的值)。会改变原来的值浅拷贝只会拷贝第一层(外面第一层容器)的地址(也就是b拷贝的是引用的地址,不会拷贝值)a={"name":"sc","score":[80,90,100]}b=a.copy()b["score"].append(110)a,b都会变成{"name":"sc","score":[80,90,100,110]} a,b的id是不一样的 但是a["score"]和b["score"]是一样的 拷贝的都是地址 {“name的地址”:“sc的地址”,“score的地址”:“列表的地址”}lst=[[]]*3这也是浅拷贝的一种lst=[[]]*3 得到[[],[],[]]lst[0].append(1) 得到[[1],[1],[1]]深拷贝不会发生这个情况 深拷贝就是拷贝每一层地址import copya={"name":"sc","score":[80,90,100]}b=copy.deepcopy(a)拷贝的是:{"新的name":"新的sc","新的score":新的列表}这样a["score"]和b["score"]的id是不一样的只有用copy.deepcopy才是深拷贝 其他都是浅拷贝
python的super super easy教程 | 垃圾回收 引用计数 深拷贝和浅拷贝相关推荐
- 垃圾回收-- 引用计数法
引用计数法 引用计数法,最重要的就是计数器,记录有多少引用该对象 引用计数法与mutator 的执行密切相关,在mutator 的处理过程中通过增减计数器的值来进行内存管理, 在分配和更新对象时会发生 ...
- python 类定义 垃圾_什么是python对象摧毁?python中的对象摧毁(垃圾回收)机制是什么?...
在这篇文章之中我们来了解一下python对象摧毁(垃圾回收),对于刚刚接触到python这一编程语言的朋友来说,对于python对象摧毁(垃圾回收)的了解应该比较少,并且不清楚关于python垃圾回收 ...
- 深度解析Python的内存管理机制:垃圾回收机制
Python程序在运行时,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量,计算完成后,再将结果输出到永久性存储器中.但是当数据量过大,或者内存空间管理不善,就很容易出现内存溢出的情况,程序可 ...
- python实现链表的删除_Python垃圾回收机制
python作为一门解释型语言,以代码简洁易懂著称.我们可以直接对名称赋值,而不必声明类型.名称类型的确定.内存空间的分配与释放都是由python解释器在运行时进行的.python这一自动管理内存功能 ...
- python入门系列:对象引用、垃圾回收、可变性
Python中的变量是什么 引言 Python和java中的变量本质不一样,java的变量可以理解为一个盒子,用来容纳我们的对象,使用前要先声明它,好分配给我们合适的内存空间.Python的变量可以理 ...
- [流畅的Python][8][对象引用、可变性和垃圾回收]
第8章 对象引用.可变性和垃圾回收 "你不开心,"白骑士用一种忧虑的声调说,"让我给你唱一首歌安 慰你吧--这首歌的曲名叫作 :<黑线鳕的眼睛>." ...
- Jvm(20),如何定义为垃圾对象----引用计数法
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...
- 对象是否要被回收(引用计数和可达性分析算法)
java堆和方法区主要存放各种类型的对象(方法区中也存储一些静态变量和全局常量等信息),那么我们在使用GC对其进行回收的时候首先要考虑的就是如何判断一个对象是否应该被回收.也就是要判断一个对象是否还有 ...
- python list 深复制_Python中list的复制及深拷贝与浅拷贝探究
在Python中,经常要对一个list进行复制.对于复制,自然的就有深拷贝与浅拷贝问题.深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这 ...
最新文章
- 深入Jetty源码之HTTP协议
- INNODB在裸设备上的性能简单测试
- Python类访问限制
- 安装angular cli_Angular 9适用于初学者—如何使用Angular CLI安装第一个应用程序
- 实践SaltStack安装和配置管理
- 无人驾驶智能车竞速赛,智能大会无人驾驶比赛
- 网页鼠标点击特效案例收集
- 企鹅智库:2019-2020中国互联网趋势报告
- 三菱Q系列总线型项目程序全套,三菱PLC程序
- 2021年中青杯B题港珠澳大桥桥梁设计与安全策略数学建模全过程文档及程序
- 步进电机基础(4.2)-步进电机的技术要点之磁性材料、绝缘材料与线圈、轴承、减速器
- 推荐10个免费的html,10个免费的HTML在线编辑工具
- php博客 程序 论文,php博客系统论文 (附加程序代码)
- linux灵活提取ip脚本
- kali安装中文拼音输入法2
- Ubuntu20.04更换系统默认启动内核
- 浅谈group by和order by的用法和区别
- 设计模式的七大原则之单一职责原则
- 如果你身边有程序员 今天对他好一点
- 如何减小Ubuntu 16.04系统下VMware虚拟机硬盘空间占用过大问题