“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>
= Reference Counting =
+
= 引用计数 =
  
The macros in this section are used for managing reference counts of Python
+
本节中的宏用于管理 Python 对象的引用计数。
objects.
 
  
; void <code>Py_INCREF</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''o''<span class="sig-paren">)</span>
+
; <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 />
: Increment the reference count for object ''o''. The object must not be <code>NULL</code>; if you aren't sure that it isn't <code>NULL</code>, use [[#c.Py_XINCREF|<code>Py_XINCREF()</code>]].
 
  
; void <code>Py_XINCREF</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''o''<span class="sig-paren">)</span>
+
: 增加对象 ''o'' 的引用计数。 对象不能是<code>NULL</code>; 如果您不确定它不是 <code>NULL</code>,请使用 [[#c.Py_XINCREF|Py_XINCREF()]]。
: Increment the reference count for object ''o''. The object may be <code>NULL</code>, in which case the macro has no effect.
+
 
 +
; <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 <code>Py_DECREF</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''o''<span class="sig-paren">)</span></dt>
+
<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>Decrement the reference count for object ''o''. The object must not be <code>NULL</code>; if
+
</dt>
you aren't sure that it isn't <code>NULL</code>, use [[#c.Py_XDECREF|<code>Py_XDECREF()</code>]]. If the reference
+
<dd><p>减少对象 ''o'' 的引用计数。 对象不能是<code>NULL</code>; 如果您不确定它不是 <code>NULL</code>,请使用 [[#c.Py_XDECREF|Py_XDECREF()]]。 如果引用计数达到零,则调用对象类型的释放函数(不能是 <code>NULL</code>)。</p>
count reaches zero, the object's type's deallocation function (which must not be
 
<code>NULL</code>) is invoked.</p>
 
 
<div class="admonition warning">
 
<div class="admonition warning">
  
 
<p>警告</p>
 
<p>警告</p>
<p>The deallocation function can cause arbitrary Python code to be invoked (e.g.
+
<p>释放函数可以导致任意 Python 代码被调用(例如 当具有 <code>__del__()</code> 方法的类实例被释放时)。 虽然此类代码中的异常不会传播,但执行的代码可以自由访问所有 Python 全局变量。 这意味着在调用 [[#c.Py_DECREF|Py_DECREF()]] 之前,可从全局变量访问的任何对象都应处于一致状态。 例如,从列表中删除对象的代码应复制临时变量中对已删除对象的引用,更新列表数据结构,然后为临时变量调用 [[#c.Py_DECREF|Py_DECREF()]]</p>
when a class instance with a <code>__del__()</code> method is deallocated). While
 
exceptions in such code are not propagated, the executed code has free access to
 
all Python global variables. This means that any object that is reachable from
 
a global variable should be in a consistent state before [[#c.Py_DECREF|<code>Py_DECREF()</code>]] is
 
invoked. For example, code to delete an object from a list should copy a
 
reference to the deleted object in a temporary variable, update the list data
 
structure, and then call [[#c.Py_DECREF|<code>Py_DECREF()</code>]] for the temporary variable.</p>
 
  
 
</div></dd></dl>
 
</div></dd></dl>
  
; void <code>Py_XDECREF</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''o''<span class="sig-paren">)</span>
+
; <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 />
: Decrement the reference count for object ''o''. The object may be <code>NULL</code>, in which case the macro has no effect; otherwise the effect is the same as for [[#c.Py_DECREF|<code>Py_DECREF()</code>]], and the same warning applies.
+
 
 +
: 减少对象 ''o'' 的引用计数。 对象可能是<code>NULL</code>,这种情况下宏不起作用; 否则效果与 [[#c.Py_DECREF|Py_DECREF()]] 相同,并且相同的警告适用。
  
 
<dl>
 
<dl>
<dt>void <code>Py_CLEAR</code><span class="sig-paren">(</span>[[../structures#c|PyObject]] *''o''<span class="sig-paren">)</span></dt>
+
<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>Decrement the reference count for object ''o''. The object may be <code>NULL</code>, in
+
</dt>
which case the macro has no effect; otherwise the effect is the same as for
+
<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|<code>Py_DECREF()</code>]], except that the argument is also set to <code>NULL</code>. The warning
+
<p>每当减少垃圾回收期间可能遍历的对象的引用计数时,最好使用此宏。</p></dd></dl>
for [[#c.Py_DECREF|<code>Py_DECREF()</code>]] does not apply with respect to the object passed because
 
the macro carefully uses a temporary variable and sets the argument to <code>NULL</code>
 
before decrementing its reference count.</p>
 
<p>It is a good idea to use this macro whenever decrementing the reference
 
count of an object that might be traversed during garbage collection.</p></dd></dl>
 
  
The following functions are for runtime dynamic embedding of Python:
+
以下函数用于 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_DecRef(PyObject *o)</code>. They are
+
 
simply exported function versions of [[#c.Py_XINCREF|<code>Py_XINCREF()</code>]] and
+
以下函数或宏仅用于解释器核心:<code>_Py_Dealloc()</code>、<code>_Py_ForgetReference()</code>、<code>_Py_NewReference()</code>,以及全局变量<code>_Py_RefTotal</code>。
[[#c.Py_XDECREF|<code>Py_XDECREF()</code>]], respectively.
+
 
 +
 
 +
</div>
 +
<div class="clearer">
  
The following functions or macros are only for use within the interpreter core:
 
<code>_Py_Dealloc()</code>, <code>_Py_ForgetReference()</code>, <code>_Py_NewReference()</code>,
 
as well as the global variable <code>_Py_RefTotal</code>.
 
  
  
 
</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() 相同,只是参数也设置为 NULLPy_DECREF() 的警告不适用于传递的对象,因为宏小心地使用临时变量并将参数设置为 NULL,然后再减少其引用计数。

每当减少垃圾回收期间可能遍历的对象的引用计数时,最好使用此宏。

以下函数用于 Python 的运行时动态嵌入:Py_IncRef(PyObject *o)Py_DecRef(PyObject *o)。 它们分别是 Py_XINCREF()Py_XDECREF() 的简单导出函数版本。

以下函数或宏仅用于解释器核心:_Py_Dealloc()_Py_ForgetReference()_Py_NewReference(),以及全局变量_Py_RefTotal