擅长:python、mysql、java
<p>我首先认为<code>dict.clear</code>只是执行了一些引用减少,让垃圾回收器完成脏的非O(1)工作,但是看看<a href="https://github.com/python/cpython/blob/master/Objects/dictobject.c#L1636" rel="nofollow noreferrer">source code</a>(感谢timgeb提供了链接),似乎并不是这样:</p>
<pre><code> oldvalues = mp->ma_values;
if (oldvalues == empty_values)
return;
/* Empty the dict... */
dictkeys_incref(Py_EMPTY_KEYS);
mp->ma_keys = Py_EMPTY_KEYS;
mp->ma_values = empty_values;
mp->ma_used = 0;
mp->ma_version_tag = DICT_NEXT_VERSION();
/* ...then clear the keys and values */
if (oldvalues != NULL) {
n = oldkeys->dk_nentries;
for (i = 0; i < n; i++)
Py_CLEAR(oldvalues[i]);
</code></pre>
<p>我看到的是,如果字典有值,那么会执行一个循环来减少对这些值的引用,并将指针设置为<code>NULL</code>。所以看起来<code>O(n)</code>不是{<cd4>},因为它取决于值的数目。在</p>
<p>当您分配给这样的新dict时,<code>d = {}</code>,这是<code>O(1)</code>,但是当不再被引用时,垃圾回收器必须删除旧对象。这在赋值时可能不正确,但除非python突然退出,否则会发生这种情况。在</p>