“Python/docs/3.9/c-api/refcounting”的版本间差异
来自菜鸟教程
Python/docs/3.9/c-api/refcounting
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:引用计数 — Python 文档}} | ||
<div id="reference-counting" class="section"> | <div id="reference-counting" class="section"> | ||
<span id="countingrefs"></span> | <span id="countingrefs"></span> | ||
− | = | + | = 引用计数 = |
− | + | 本节中的宏用于管理 Python 对象的引用计数。 | |
− | |||
− | ; void < | + | ; <span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">Py_INCREF</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> |
− | |||
− | ; void < | + | : 增加对象 ''o'' 的引用计数。 对象不能是<code>NULL</code>; 如果您不确定它不是 <code>NULL</code>,请使用 [[#c.Py_XINCREF|Py_XINCREF()]]。 |
− | : | + | |
+ | ; <span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">Py_XINCREF</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> | ||
+ | |||
+ | : 增加对象 ''o'' 的引用计数。 对象可能是 <code>NULL</code>,在这种情况下宏不起作用。 | ||
<dl> | <dl> | ||
− | <dt>void < | + | <dt><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">Py_DECREF</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>减少对象 ''o'' 的引用计数。 对象不能是<code>NULL</code>; 如果您不确定它不是 <code>NULL</code>,请使用 [[#c.Py_XDECREF|Py_XDECREF()]]。 如果引用计数达到零,则调用对象类型的释放函数(不能是 <code>NULL</code>)。</p> | |
− | |||
− | <code>NULL</code> | ||
<div class="admonition warning"> | <div class="admonition warning"> | ||
<p>警告</p> | <p>警告</p> | ||
− | <p> | + | <p>释放函数可以导致任意 Python 代码被调用(例如 当具有 <code>__del__()</code> 方法的类实例被释放时)。 虽然此类代码中的异常不会传播,但执行的代码可以自由访问所有 Python 全局变量。 这意味着在调用 [[#c.Py_DECREF|Py_DECREF()]] 之前,可从全局变量访问的任何对象都应处于一致状态。 例如,从列表中删除对象的代码应复制临时变量中对已删除对象的引用,更新列表数据结构,然后为临时变量调用 [[#c.Py_DECREF|Py_DECREF()]]。</p> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</div></dd></dl> | </div></dd></dl> | ||
− | ; void < | + | ; <span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">Py_XDECREF</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> |
− | : | + | |
+ | : 减少对象 ''o'' 的引用计数。 对象可能是<code>NULL</code>,这种情况下宏不起作用; 否则效果与 [[#c.Py_DECREF|Py_DECREF()]] 相同,并且相同的警告适用。 | ||
<dl> | <dl> | ||
− | <dt>void < | + | <dt><span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">Py_CLEAR</span></span></span><span class="sig-paren">(</span>[[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">o</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>减少对象 ''o'' 的引用计数。 对象可能是<code>NULL</code>,这种情况下宏不起作用; 否则效果与 [[#c.Py_DECREF|Py_DECREF()]] 相同,只是参数也设置为 <code>NULL</code>。 [[#c.Py_DECREF|Py_DECREF()]] 的警告不适用于传递的对象,因为宏小心地使用临时变量并将参数设置为 <code>NULL</code>,然后再减少其引用计数。</p> | |
− | [[#c.Py_DECREF| | + | <p>每当减少垃圾回收期间可能遍历的对象的引用计数时,最好使用此宏。</p></dd></dl> |
− | |||
− | |||
− | |||
− | <p> | ||
− | |||
− | + | 以下函数用于 Python 的运行时动态嵌入:<code>Py_IncRef(PyObject *o)</code>、<code>Py_DecRef(PyObject *o)</code>。 它们分别是 [[#c.Py_XINCREF|Py_XINCREF()]] 和 [[#c.Py_XDECREF|Py_XDECREF()]] 的简单导出函数版本。 | |
− | <code>Py_IncRef(PyObject *o)</code> | + | |
− | + | 以下函数或宏仅用于解释器核心:<code>_Py_Dealloc()</code>、<code>_Py_ForgetReference()</code>、<code>_Py_NewReference()</code>,以及全局变量<code>_Py_RefTotal</code>。 | |
− | [[#c.Py_XDECREF|<code> | + | |
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
− | |||
− | |||
− | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:50的最新版本
引用计数
本节中的宏用于管理 Python 对象的引用计数。
- void Py_INCREF(PyObject *o)
- 增加对象 o 的引用计数。 对象不能是
NULL
; 如果您不确定它不是NULL
,请使用 Py_XINCREF()。
- void Py_XINCREF(PyObject *o)
- 增加对象 o 的引用计数。 对象可能是
NULL
,在这种情况下宏不起作用。
- void Py_DECREF(PyObject *o)
减少对象 o 的引用计数。 对象不能是
NULL
; 如果您不确定它不是NULL
,请使用 Py_XDECREF()。 如果引用计数达到零,则调用对象类型的释放函数(不能是NULL
)。警告
释放函数可以导致任意 Python 代码被调用(例如 当具有
__del__()
方法的类实例被释放时)。 虽然此类代码中的异常不会传播,但执行的代码可以自由访问所有 Python 全局变量。 这意味着在调用 Py_DECREF() 之前,可从全局变量访问的任何对象都应处于一致状态。 例如,从列表中删除对象的代码应复制临时变量中对已删除对象的引用,更新列表数据结构,然后为临时变量调用 Py_DECREF()。
- void Py_XDECREF(PyObject *o)
- 减少对象 o 的引用计数。 对象可能是
NULL
,这种情况下宏不起作用; 否则效果与 Py_DECREF() 相同,并且相同的警告适用。
- void Py_CLEAR(PyObject *o)
减少对象 o 的引用计数。 对象可能是
NULL
,这种情况下宏不起作用; 否则效果与 Py_DECREF() 相同,只是参数也设置为NULL
。 Py_DECREF() 的警告不适用于传递的对象,因为宏小心地使用临时变量并将参数设置为NULL
,然后再减少其引用计数。每当减少垃圾回收期间可能遍历的对象的引用计数时,最好使用此宏。
以下函数用于 Python 的运行时动态嵌入:Py_IncRef(PyObject *o)
、Py_DecRef(PyObject *o)
。 它们分别是 Py_XINCREF() 和 Py_XDECREF() 的简单导出函数版本。
以下函数或宏仅用于解释器核心:_Py_Dealloc()
、_Py_ForgetReference()
、_Py_NewReference()
,以及全局变量_Py_RefTotal
。