添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

问题缘起于python-cn邮件列表的一个问题:http://groups.google.it/group/python-cn/browse_thread/thread/758891b4342eb2d9/92c12bf6acd667ac
有趣的是,为什么在Python2.4中sys.getrefcount(11111111)的结果是2,到了Python2.5中却摇身一变,变成了 3?更令人惊奇的是,如果你在Python2.5的IDLE中运行sys.getrefcount(111111),你会惊奇地发现,好了,现在的结果又 变成2了。我们知道sys.getrefcount输出的是一个对象的引用计数,为什么相同的代码,相同的对象,在不同的运行环境中的引用计数却不同了? 原因是,我们有一个致命的疏漏。
在考察sys.getrefcount时,我们只看到了它的运行结果,但是实际上在运行的背后还有一个更加重要的幕后推手——编译。为了确认编译是否对对象的引用计数产生影响,我们来考察几个例子:

1、交互式环境下:
Python 2.5 (r25:51908, May 27 2007, 09:33:26) [MSC v.1310 32 bit (Inte
32
Type "help", "copyright", "credits" or "license" for more information.

>>> import sys
>>> sys.getrefcount(11111111) 2、文件方式执行 :
[ref.py]
import sys
print sys.getrefcount(11111111)
结果如下:
F:/compile/Python-2.5/PCbuild>python ref.py 3、文件方式执行(避开编译影响)
[demo.py]
import ref
结果如下:
F:/compile/Python-2.5/PCbuild>python demo.py
由此可见,实际上多余的引用是由Python的编译过程贡献的,在1、2两种执行方式下,Python都会在开始时激活一个编译的动作;而在执行方式3下,import机制会导致产生一个ref.pyc文件,所以不会在每次执行时都会激活编译动作。
但是,但是,我们看到在Python2.5的交互式环境中和IDLE环境中,都需要进行编译,而输出的结果却不同,这又是什么原因呢?嗯,这就需要从Python的源码中找原因了。我们先来看看sys.getrefcount到底输出了个什么玩意儿: [sysmodule.c] python ,每个对象都有存有该对象的 引用 总数,即 引用 计数 (feference count) 引用 计数 原理 1.每个对象维护一个ob_ref减1,用来记录该对象当前被 引用 的次数 2.每当新的 引用 指向该对象时,它的 引用 计数 ob_ref加1 3.每当该对象的 引用 失效时ob_ref减1 4.一旦对象的 引用 计数 为0,该对象可以被回收,对象占用的内存空间将被释放 5.它的缺点是需要额外的空间维护 计数 ,这个问题是其次的 6.最主要的问题是它不能解决对象的“循环 引用 ” 获取 引用 计数 .getrefcount( - python 所有的数据都是通过类来实现的,对象的管理是通过 引用 计数 实现的 - 当创建一个对象赋值给一个变量时, 引用 计数 为1,当多一个变量指向该对象时, 计数 值加1;当少一个变量指向对象时, 计数 值减1。 计数 值减到0时会调用`__del__`方法释放存储空间 - 不可变变量 引用 计数 是没有意义的 - 示例: ``` python import ... 本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程 用到的ai工具。 引用 计数 法增量操作如果对象的 引用 数量增加,就在该对象的 计数 器上进行增量操作。在实际 它是由宏Py_INCREF() 执行的。#define Py_INCREF(op) (((Py Object *)(op))->ob_refcnt++)#define Py_XINCREF(op) if ((op) == NULL ) ; else Py_INCREF(op)除了增量操作外,还要执行 NULL 检查,P... 全局解释器锁(Global Interpreter Lock,GIL)是 Python 解释器 的一个重要概念。它是一个互斥锁,用于保护解释器免受并发线程的干扰。虽然 Python 是一种多线程语言,但由于GIL的存在, Python 的多线程并不能有效地利用多核CPU进行并行计算。这意味着在CPU密集型任务 Python 多线程可能比较慢,但在I/O密集型任务 Python 多线程可以很好地工作。 在 Python 源码及扩展模块 ,对 引用 计数 的使用有三种方式: 拥有 引用 、 借用 引用 和窃取 引用 。 拥有 引用 :拥有 引用 比较简单,针对Py Object 对象调用Py_INCREF或Py_XINCREF即可,如将一个对象加入到字典 时,会分别对key和value调用Py_INCREF 对于创建类函数,对象创建成功后,在函数的内部会自动增加 引用 计数 ,此类函数有: Py Object * PyLong 开始学习 python ,再看到 python 学习手册第六章时,提到一个函数,getrefcount,这个 监控 对象的 引用 计数 .于是写了一个列表测试,发现在3.0版本以上.列表的开始 计数 为2,不是很明白,于是在网上找到这篇文章进行分析. 原文地址为: http://blog.csdn.net/balabalamerobert/article/details/1649490 ------- 链接:https://zhidao.baidu.com/question/1859942302652101307.html python 内部使用 引用 计数 ,来保持追踪内存 的对象, Python 内部记录了对象有多少个 引用 ,即 引用 计数 ,当对象被创建时就创建了一个 引用 计数 ,当对象不再需要时,这个对象的 引用 计数 为0时,它被垃圾回收。 总结一下对象会在一下情况下 引用 计数 加1: 1.对象被创建:x=4 查看变量 引用 计数 及是否 引用 的方法 对于PHP源码阅读过程 ,变量是一个非常重要的概念,更重要的是对变量的容器ZVAL理解, 如果在无法使用*nix环境进行debug,或者不想在windows环境下折腾开发环境,你可以考虑使用下面的两个方法简单的查看变量关于 引用 计数 及是否 引用 的信息 debug_zval_dump函数 debug_zval_dump函数是PHP自带的标准函数。它的作 How to get reference count of a Py Object from C++?There are functions Py_INCREF and Py_DECREF which increase/decrease it, but I haven't found any function which return object 's reference count.I need ...