<p>我不鼓励在这里使用<code>sum</code>,因为它是<a href="https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm" rel="nofollow noreferrer">Schlemiel the Painter's algorithm</a>的一种形式。<code>sum</code>实际上用<code>str</code>禁止它;他们没有试图阻止所有的序列使用,以避免减慢<code>sum</code>试图阻止每一个误用,但这仍然是一个坏主意。你知道吗</p>
<p>问题是,这意味着每次都要构建越来越大的临时<code>list</code>,在构建下一个临时之后,通过一遍又一遍地复制到目前为止看到的所有东西,再加上新的东西,把上一个临时文件扔掉。如果第一个列表中有一百万个项目,并且您还有十个<code>list</code>要连接到它,那么您至少复制了一千万个元素(即使其他十个<code>list</code>是空的)。您的原始代码实际上更好,因为使用执行就地扩展的<code>+=</code>操作符,在<code>O(n)</code>(对于所有<code>list</code>范围内的<code>n</code>元素)中保持最差的性能,而不是<code>O(n*m)</code>(对于<code>m</code><code>list</code>范围内的<code>n</code>元素)。你知道吗</p>
<p>它还存在只对一个一致类型工作的问题;如果一些输入是<code>list</code>、一些<code>tuple</code>和一些生成器,<code>sum</code>将不工作(因为<code>list.__add__</code>将不接受另一端的非<code>list</code>操作数)。你知道吗</p>
<p>所以别那么做。这是<a href="https://docs.python.org/3/library/itertools.html#itertools.chain" rel="nofollow noreferrer">what ^{<cd21>} and it's alternate constructor, ^{<cd22>} were made for</a>:</p>
<pre><code>from itertools import chain
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
joined_list = list(chain.from_iterable(list_of_lists))
</code></pre>
<p>它保证<code>O(n)</code>,可以与任何您抛出的iterables一起工作,等等</p>
<p>是的,很明显,如果你一块只有三个元素,那就不重要了。但是如果输入iterables的大小或iterables的数量任意大,或者类型不一致,<code>chain</code>将起作用,<code>sum</code>将不起作用</p>