<p>在<a href="https://stackoverflow.com/questions/52961311/difference-between-a-list-comprehension-and-a-for-loop">stackoverflow</a>中有一个标题完全相同的问题,但问题不是我想问的。我在解一个<a href="https://leetcode.com/problems/subsets/" rel="nofollow noreferrer">leetcode problem</a>时,发现列表理解和for循环之间有一个非常有趣的区别。请比较以下两种方法。你知道吗</p>
<h2>方法1</h2>
<pre><code>set1 = [[]]
num = [1,2,3]
for n in num:
for s in set1:
set1 += [ s + [n] ]
print(set1)
</code></pre>
<h2>方法2</h2>
<pre><code>set1 = [[]]
num = [1,2,3]
for n in num:
set1 += [ s + [n] for s in set1]
print(set1)
</code></pre>
<p><code>Approach 1</code>挂起,<code>Approach 2</code>不挂起,并生成正确的结果。我认为原因是:<br/>
1) <code>Approach 1</code>为set1的每个成员向set1添加元素。因此,for循环永远不会结束,因为set1列表一直在增长。<br/>
2) <code>Approach 2</code>在</em></strong>处理set1中的所有元素之后更新set1<strong><em>。我理解这两种方法之间的区别是正确的吗?另外,我是否可以将<code>[ s + [n] for s in set1]</code>视为由以下伪代码生成的列表?你知道吗</p>
<pre><code>tmp = []
for s in set1:
tmp += [s + [n]]
</code></pre>
<p>问题是您正在修改在<code>for s in set1</code>循环中迭代的列表。这可以通过使用copy()来避免,以确保在列表的单独实例上迭代:<code>for s in set1.copy()</code>。您还可以约束循环的长度:<code>for s in set1[:len(set1)]</code></p>