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的垃圾回收机制以及引用计数的更多相关文章

  1. Python的垃圾回收机制(引用计数+标记清除+分代回收)

    一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...

  2. PHP的垃圾回收机制之引用计数

    1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...

  3. python之垃圾回收机制

    一.前言 Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题. 内存 ...

  4. 【Python】 垃圾回收机制和gc模块

    垃圾回收机制和gc模块 Py的一个大好处,就是灵活的变量声明和动态变量类型.虽然这使得学习py起来非常方便快捷,但是同时也带来了py在性能上的一些不足.其中相关内存比较主要的一点就是py不会对已经销毁 ...

  5. 详解python的垃圾回收机制

    python的垃圾回收机制 一.引子 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式 ...

  6. 谈一谈python的垃圾回收机制

    [python的垃圾回收机制是怎么实现的] 在C语言时代程序员要负责内存的申请和释放,虽然这样的程序可以对资源进行精细的控制.但是它也有它的问题.这就要求程序员 要写许多与业务逻辑无关的内容在代码里面 ...

  7. python中垃圾回收机制

    Python垃圾回收机制详解   一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...

  8. python的垃圾回收机制和析构函数__del__

    析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...

  9. python基础-垃圾回收机制

    垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1:当一个对象的引用被销毁时,对象 ...

随机推荐

  1. MongoDB中使用的SCRAM-SHA1认证机制

    摘要: 介绍 SCRAM是密码学中的一种认证机制,全称Salted Challenge Response Authentication Mechanism. SCRAM适用于使用基于『用户名:密码』这 ...

  2. 6-Ubuntu与Windows不能相互复制

    在安装Ubuntu系统后发现与Windows系统的文件不能相互复制,网上查了很多教程,发现都是不能用的,能实现的方法如下所示: 第一步: sudo apt-get autoremove open-vm ...

  3. 2-ubuntu下访问window的磁盘

    双系统Ubuntu无法进入Windows磁盘的解决方法 有些用户在电脑上安装了Ubuntu和Win10的双系统,正常情况下Ubuntu是可以正常访问Windows磁盘的.但是有些用户就是无法再Ubun ...

  4. What's App has the Qt?

    收集了我看到的使用Qt开发的应用程序或者含有Qt库的应用程序 CNTV CNTV, 一个中央电视台的视频直播软件, 从下面卸载后的残余目录树,可以看到,存在部分库使用的就是Qt的.下面的目录树,已经删 ...

  5. C语言日志处理

    一.简介 zlog是一个高可靠性.高性能.线程安全.灵活.概念清晰的纯C日志函数库,在效率.功能.安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性. 二.安装 下载 https:// ...

  6. Laravel 使用 seeder 使用要点

    一.关于 DB use DB; 再使用 DB::table(database.table)->get(); 二.关于 ERROR 1366 (HY000): Incorrect string v ...

  7. 微交互:App成功的秘诀

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 最好的产品拥有两个很棒的特点:功能和细节.产品的功能可成功吸引到人们的注意力,而产品的细节则可留住你 ...

  8. centos7 单台zookeeper安装

    1.创建 /usr/local/services/zookeeper 文件夹:  mkdir -p /usr/local/services/zookeeper 2.进入到 /usr/local/ser ...

  9. centos环境下登录mysql报 ERROR 1045 (28000)怎么解决

    centos环境下登录mysql报 ERROR 1045 (28000)怎么解决 新入手一台虚拟机,Centos7系列的操作系统,安装mysql后,执行连接出现了Mysql ERROR 1045 (2 ...

  10. Ubuntu命令基础

    Ubuntu命令基础 1.打开终端窗口快捷键. Ctrl+alt+t 2.更新设置root密码. $sudo passwd  root  3.切换到root用户用su,前提是自己设置了root密码(看 ...