Python的垃圾回收机制以及引用计数
Python中的计数引用
在Python中,由于Python一门动态的语言,内部采用的指针形式对数据进行标记的,并不像c/c++那样,通过指定的数据类型并分配相应的数据空间,Python中定义的变量名其实就是一个指针型的变量,如果我们在程序定义了重复的对象,那么Python底层不是开辟两个内存空间用来存放相同的数据对象,而是将不同的指针变量指向同一个数据对象。
例如:

那么“1”这个数据对象被变量a引用了一次,但是后来a又被赋值给了b,a和b的值都是1,但是他们共用数据对象,也就是它们通过指针共同指向“1”,这样系统就只要开辟一个内存空间来存放一个数值,从而节省了一定的内存空间。这种多个指针变量同事指向同一个数据对象,在Python中如果需要释放,那会怎么做呢,这就是Python中的垃圾回收机制。
Python中的垃圾回收机制
当Python中有不同的变量指向了同一个数据对象时,那么Python解释器会在这个数据对象上记上一个数,叫做引用次数,也即是该数据对象被其他的变量对象所用的次数,每多一个变量引用该数据对象,那么引用次数加1,当该引用次数为0时,那么Python解释器将会在内存中释放该数据对象。
当时是用del语句对变量进行删除时,那么并不是将整个变量都删除了,而是对该变量的计数引用进行减一的操作。
例如:

当我们定义了一个变量a,并且赋值为120,此时查看数据对象120被引用的次数,sys.getrefcount(120)语句用来查看数据对象120被引用的次数,我们可以看到为24,但是我们将变量a赋值给一个新的变量b后,再次查看数据对象120的被引用的次数,此时为26,因为sys.getrefcount()这个方法对数据对象120的引用也算是一次引用,所以是26次。
Python的垃圾回收机制以及引用计数的更多相关文章
- Python的垃圾回收机制(引用计数+标记清除+分代回收)
一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...
- PHP的垃圾回收机制之引用计数
1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...
- python之垃圾回收机制
一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...
- 【Python】 垃圾回收机制和gc模块
垃圾回收机制和gc模块 Py的一个大好处,就是灵活的变量声明和动态变量类型.虽然这使得学习py起来非常方便快捷,但是同时也带来了py在性能上的一些不足.其中相关内存比较主要的一点就是py不会对已经销毁 ...
- 详解python的垃圾回收机制
python的垃圾回收机制 一.引子 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式 ...
- 谈一谈python的垃圾回收机制
[python的垃圾回收机制是怎么实现的] 在C语言时代程序员要负责内存的申请和释放,虽然这样的程序可以对资源进行精细的控制.但是它也有它的问题.这就要求程序员 要写许多与业务逻辑无关的内容在代码里面 ...
- python中垃圾回收机制
Python垃圾回收机制详解 一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...
- python的垃圾回收机制和析构函数__del__
析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...
- python基础-垃圾回收机制
垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1:当一个对象的引用被销毁时,对象 ...
随机推荐
- Kubuntu中thunderbird最小化到任务栏
作为邮件客户端,如果没有办法显示在任务栏中,实在是说不过去.遗憾的是thunderbird默认真不带这个功能(因为Linux的桌面系统太混乱了?)... 当然,解决也十分简单,只要安装Firetray ...
- 创建Kafka0.8.2生产者与消费者
一.下载安装Kafka0.8.2 二.vi config/server.properties 三.修改为advertised.host.name=192.168.1.76 四.rm -rf /tmp ...
- nat转发
http://www.revsys.com/writings/quicktips/nat.html https://www.alibabacloud.com/zh/product/nat?spm=a3 ...
- 5-math中函数汇总
math.h 数学函数库,一些数学计算的公式的具体实现是放在math.h里,具体有:1 三角函数double sin (double);double cos (double);double tan ( ...
- springboot中端点监管 endpoint actuator
1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- weblogic 初始化
weblogic无法启动,或是忘记了登陆密码,需要初始化,可以删除weblogic配置然后重新生成配置.步骤如下 1> 找到weblogic的启动路径,打开jdeveloper,run后,查看日 ...
- AES加解密
AES加密类 <?php //php aes加密类 class AESMcrypt { public $iv = null; public $key = null; ; private $cip ...
- [Training Video - 1] [Selenium Basics] [What is Selenium]
What is Selenium? Browser Automation Testings Tool: Mozilla IE 6,7,8 Google Chrome Opera 8,9,10 Safa ...
- c11时间库一个小例子
#pragma once #include <chrono> #include <string> #include <iostream> #include < ...
- 前端传递对象列表到WebApi
public Int64 objectPOC(JObject jsonWrapper) { dynamic jsonValues = jsonWrapper; JArray jsonInput = j ...