擅长:python、mysql、java
<p>显然,是第一个版本。让我解释一下原因。</p>
<ol>
<li><p>当您执行<code>[None] * n</code>操作时,Python会在内部创建一个大小为<code>n</code>的列表对象,并且它会将相同的对象(这里是<code>None</code>)复制到所有内存位置(这是原因,您应该仅在处理不可变对象时才使用此方法)。所以内存分配只做一次。在那之后,通过一次迭代列表将对象复制到所有元素。<a href="http://hg.python.org/cpython/file/52256a5861fa/Objects/listobject.c#l545" rel="nofollow">^{<cd4>}</a>是与此类列表创建相对应的函数。</p>
<pre><code># Creates the list of specified size
np = (PyListObject *) PyList_New(size);
....
...
items = np->ob_item;
if (Py_SIZE(a) == 1) {
elem = a->ob_item[0];
for (i = 0; i < n; i++) {
items[i] = elem; // Copies the same item
Py_INCREF(elem);
}
return (PyObject *) np;
}
</code></pre></li>
<li><p>当您使用列表理解来构建列表时,Python无法知道正在创建的列表的实际大小,因此它最初会分配一块内存,而对象的一个<strong>新副本</strong>存储在列表中。当列表超出分配的长度时,它必须再次分配内存并继续创建新对象并将其存储在列表中。</p></li>
</ol>