擅长:python、mysql、java
<p>你得自己动手。以下是一个可能的实现(不进行错误检查):</p>
<pre class="lang-c prettyprint-override"><code>PyObject *my_pop_from_list(PyListObject *lst){
//TODO: check lst isn't empty
Py_SIZE(lst) -= 1; // forget last element
return PyList_GET_ITEM(lst, PyList_GET_SIZE(lst)); // return last element
}
</code></pre>
<p><a href="https://docs.python.org/3/c-api/structures.html#c.Py_SIZE" rel="nofollow noreferrer">^{<cd1>}</a>只是一个访问<code>lst->ob_size</code>的宏,我们在执行<code>pop</code>时减少它。在</p>
<p>此外,还使用没有错误检查的版本,即<code>PyList_GET_ITEM</code>和<code>PyList_GET_SIZE</code>,因为一旦它被建立(参见TODO注释),列表就不是空的-不会有任何问题。在</p>
<p>调用者接收到一个新的引用,尽管<code>PyList_GET_ITEM</code>返回一个借用的引用:按照我们在上面代码中所做的那样减小列表的大小,使list“忘记”引用而不减少引用计数器。在</p>
<p>正如@MSeifert所指出的,这个版本不会改变底层数组的大小,就像<code>list.pop()</code>所做的那样(如果在pop之后只使用了底层数组的一半或更少)。这可以看作是上述实现的“特性”——用内存交换速度。在</p>