<p>不,不能通过<code>PyListObject</code>上的C-API直接使用<code>list.pop</code>方法</p>
<p>假设<code>list.pop</code>已经存在并且是用C实现的,那么您可以简单地查找CPython实现的功能:</p>
<pre class="lang-c prettyprint-override"><code>static PyObject *
list_pop_impl(PyListObject *self, Py_ssize_t index)
{
PyObject *v;
int status;
if (Py_SIZE(self) == 0) {
/* Special-case most common failure cause */
PyErr_SetString(PyExc_IndexError, "pop from empty list");
return NULL;
}
if (index < 0)
index += Py_SIZE(self);
if (index < 0 || index >= Py_SIZE(self)) {
PyErr_SetString(PyExc_IndexError, "pop index out of range");
return NULL;
}
v = self->ob_item[index];
if (index == Py_SIZE(self) - 1) {
status = list_resize(self, Py_SIZE(self) - 1);
if (status >= 0)
return v; /* and v now owns the reference the list had */
else
return NULL;
}
Py_INCREF(v);
status = list_ass_slice(self, index, index+1, (PyObject *)NULL);
if (status < 0) {
Py_DECREF(v);
return NULL;
}
return v;
}
</code></pre>
<p><a href="https://github.com/python/cpython/blob/v3.7.2/Objects/listobject.c#L953-L997" rel="nofollow noreferrer">Source for CPython 3.7.2</a></p>
<p>这包括许多C扩展不容易访问的函数,它还处理从特定索引(甚至是负索引)中弹出的函数。就我个人而言,我甚至不想重新实现它,只需使用<a href="https://docs.python.org/c-api/object.html#c.PyObject_CallMethod" rel="nofollow noreferrer">^{<cd5>}</a>调用<code>pop</code>方法:</p>
^{pr2}$
<p>它可能比重新实现慢一点,但应该“更安全”——不能意外地弄乱列表对象的不变量(例如调整大小条件)。在</p>
<p>另一个实现存在于<a href="https://github.com/cython/cython/blob/0.29.5/Cython/Utility/Optimize.c#L104-L111" rel="nofollow noreferrer">Cython</a></p>
^{3}$
<p>也可以根据您的用例进行调整。在</p>