[Python学习]变量存储逻辑和垃圾回收机制(GC)

一、引子

        首先,我们从两个例子入手垃圾回收机制:

a = 1000
b = 2000
a = b
a = 100
b = 200
a = b

        这两段代码的功能都是“把b变量的值赋值给a变量”,但是在Python的底层逻辑上,这两段代码的实现过程确是有所不同的。

        过程:第一段代码是在存储空间中先创建了一个对象:整数1000,之后让变量a指向这个存储空间;同理变量b;当执行 a = b 语句时,变量a由原来的指向整数1000,变为了指向整数2000,同时,刚刚创建的存储整数1000的存储空间,也被垃圾回收机制回收。

                第二段代码中,整数对象100200受到Python整数缓存机制的影响:通常对于 -5到255之间的整数,python会预先创建他们并存储,所以在执行 a = b语句后,整数100并没有被回收

二、垃圾回收机制

        有了上面的例子后,我们来正式学习Python的垃圾回收机制

        Python的垃圾回收机制(GC) 主要依赖于引用计数法为基础,并辅以“代”(generation)收集机制来处理循环引用的问题。这一机制确保了不再使用的对象能够被正确地识别并进行回收,释放内存。

  1.引用计数

        Python中每个对象在创立之初,都会获得一个引用计数,用来记录有多少个引用指向这个对象(不同于c语言的变量创建、存储机制)。

        当创建一个对象并把他赋值给一个变量时,该对象的引用计数变为1。如果有另一个变量被赋值为这个对象,该对象的引用计数加1。同样的,若是本来指向该对象的引用,现在不再指向它,则引用计数减1。当一个对象的引用计数变为0时,意味着没有任何引用指向这个对象,它就会被垃圾回收器立即回收。

  2.解决循环引用的分代收集机制

        有了基于引用计数的回收机制后,我们不禁思考一个问题,若是两个对象之间,或者多个对象之间互相引用,但是却没有任何一个变量来指向他们中的任意一个,那么会造成他们不会被回收掉=>内存泄漏

        为了解决这一问题,Python引入了分代收集机制:

                在这个系统中,所有的对象都被分配到三个“代”(generation)中的一个:0代、1代和2代。一般情况下,新创建的对象被放入0代中。如果在某次0代的垃圾回收过程中,对象存活下来,它就会被移动到1代;同样,从1代存活下来的对象会被移动到2代。因为预期较老的对象(在高代中的对象)较少会变成垃圾,所以较高代的垃圾回收频率会低于较低代的。
        垃圾回收器通过检查对象之间的引用关系,来识别循环引用。如果一组对象之间只有相互引用,而没有任何外部引用指向这组对象,这组对象就可以被认为是可回收的。

3.补充(触发条件)

        Python的垃圾回收可以被显式地触发,也可以根据需要自动触发。自动触发的条件基于分配和释放对象的数量,以及各代中对象的数量。可以通过gc模块调整垃圾回收的行为,如 启用或禁用垃圾回收、手动触发垃圾回收,以及调整代之间的阈值等。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java实用的音乐软件微信小程序的设计与实现【附项目源码】分享

基于实用的音乐软件微信小程序的设计与实现: 源码地址:https://download.csdn.net/download/weixin_43894652/88842586 一、引言 随着移动互联网的普及和微信小程序的兴起,音乐类小程序成为了用户随时随地享受音乐的重要工具。本需求文档旨在详细阐述一…

基于单片机的大棚温湿度控制系统设计

摘要:现阶段我国的科学技术方面得到了快速的发展,各项社会事业的发展也都进行了智能化技术的应用,农业事业智能化发展在现如今时代发展进程中变得越来越重要了,如果能够实现对大鹏的温度和湿度进行有效且稳定的控制,能够实现现代的农业大棚高水平的发展,这对于我国整体的…

Python 实现一个简单的中文分词处理?

在Python中,实现一个简单的中文分词处理,我们可以采用基于规则的方法,比如最大匹配法、最小匹配法、双向匹配法等。但更常见且效果更好的是使用现有的分词库,如jieba分词。   以下是使用jieba分词库进行中文分词的简单示例: 安装jieba 首先,你需要安装jieba库。如果你…

【图解物联网】第零章 前言

前言 一、本博文的写作背景 这个寒假(准确的说应该是上个学期),作者通过厚脸皮以及社牛的性格,抱住了一位老师的大腿,并且通过寒假期间突击补习,成功得到老师的赏识,得以进组进一步学习各…

c++简单使用

取消同步流是为了解决C有时遇到空格或回车&#xff08;不到\0&#xff09;就会停下的问题 #include<bits/stdc.h> using namespace std; int main() {//取消同步流ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int a, b;cin >> a>> b;cout << …

拦截器和过滤器(原理区别)

目录 一、拦截器 拦截器是什么 拦截器的使用 拦截器的实现 导入依赖 实现HandlerInterceptor接口 注册拦截器 拦截器的生命周期 拦截器的执行顺序 拦截器的生命周期 多个拦截器的执行流程 拦截器的实际使用 拦截器实现日志记录 实现接口幂等性校验 拦截器的性能…

Python import 跟 Java import 有什么区别?

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

STL——map set

文章将解决一下几个问题&#xff1a; 1.什么是set 2.什么是map 3.set应用场景 4.map应用场景 序列式容器和关联式容器 数据结构有序列式容器和关联式容器&#xff0c;序列式容器一般有vector,list,deque…&#xff0c;但关联式容器中就有map&#xff0c;关联式容器也是用来存…

23.2 微服务基础实战

23.2 微服务基础实战 课程安排1. **************************************************************************************** 课程安排 1. ****************************************************************************************

react 对Fiber架构的理解?解决了什么问题?

一、问题 JavaScript 引擎和页面渲染引擎两个线程是互斥的&#xff0c;当其中一个线程执行时&#xff0c;另一个线程只能挂起等待 如果 JavaScript 线程长时间地占用了主线程&#xff0c;那么渲染层面的更新就不得不长时间地等待&#xff0c;界面长时间不更新&#xff0c;会导…

Gis导航控件

收费工具&#xff0c;白嫖党、学生党、闹眼子党勿扰 收费金额为100元 1 概述 最近研究了一下电子海图相关内容&#xff0c;发现海图解析和显示相关的功能&#xff0c;都没有好用的开源工具… 在Gis地图显示那一块&#xff0c;有一个导航控件小控件&#xff0c;好像还没有人专门…

从前端到前端框架

原文地址&#xff1a;从前端到前端框架 - Pleasure的博客 下面是正文内容&#xff1a; 前言 这是一篇笔记&#xff0c;主要用于帮助刚入门Web全栈不久的同学。以及个人思路的记录整理。 如果你是一个全栈大师就可以直接跳过了。当然想加深一下理解也没有问题。 可能会较多谈谈…

《父母的觉醒》父母不是在培养一个“迷你版”的自己

简介 作者为美国哥伦比亚大学心理学博士沙法丽萨巴瑞。作者也写了《家庭的觉醒》。 作者的核心观点&#xff1a; 我们必须认识到&#xff0c;我们不是在培养一个“迷你版”的自己&#xff0c;而是在塑造一个具有独立特征的灵魂。正因为如此&#xff0c;我们必须铆足精神&#…

IDEA把中国大陆高校教育邮箱都封了?

今天本想趁着快到期前&#xff0c;用教育邮箱续命&#xff0c;没想到&#xff1a; 天不遂人愿&#xff01;只能继续申请开源项目的许可证&#xff01; 可惜了&#xff0c;没提交在每个月&#xff1a;

Linux命令-date命令(显示或设置系统时间与日期)

概要 date [OPTION]... [FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]主要用途 转换时间到选定的格式&#xff0c;默认为当前。设置系统时间。 参数 format&#xff1a;输出的时间格式。 format可用的转义序列如下&#xff1a;%% 百分号 %a 当地缩写的工…

Rockchip 有时遥控器ok键按下后不是确认功能,而是跳转下一个

问题平台描述 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 10.1 Kernel: 4.19 问题描述 目前市面上的Allwinner amlogic rockchip在使用外接usb遥控器&#xf…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

Git详细入门笔记

主要分为两个 一个是可视化软件&#xff0c;一个就是鼠标右键选择Git Bash 一、可视化软件 1、文件操作 点击file选项&#xff0c;可以选择添加clone&#xff0c;也可以add或者new new完文件之后&#xff0c;可以点击图形界面中的show in explorer&#xff0c;直接进入文件夹…

python垃圾回收机制

Python中的垃圾回收机制是自动的&#xff0c;它主要使用了引用计数来追踪和回收内存。 1、引用计数 当一个对象被创建时&#xff0c;就会被分配一块内存&#xff0c;然后将其引用计数设置为1。当另一个变量引用该对象时&#xff0c;引用计数就会增加1。当一个对象的引用计数变…

《数据结构》复试问答题总结

请简述深度优先遍历、广度优先遍历的基本思想&#xff1f;&#xff1a; 深度遍历是在图中先选择一个顶点&#xff0c;随后的每次遍历中选择与顶点相邻并且还没有遍历过的结点进行遍历&#xff0c;类似于树的先序遍历 广度遍历是先在图中选择一个顶点&#xff0c;并加入队列中&a…