在stackoverflow中有一个标题完全相同的问题,但问题不是我想问的。我在解一个leetcode problem时,发现列表理解和for循环之间有一个非常有趣的区别。请比较以下两种方法。你知道吗
set1 = [[]]
num = [1,2,3]
for n in num:
for s in set1:
set1 += [ s + [n] ]
print(set1)
set1 = [[]]
num = [1,2,3]
for n in num:
set1 += [ s + [n] for s in set1]
print(set1)
Approach 1
挂起,Approach 2
不挂起,并生成正确的结果。我认为原因是:
1) Approach 1
为set1的每个成员向set1添加元素。因此,for循环永远不会结束,因为set1列表一直在增长。
2) Approach 2
在处理set1中的所有元素之后更新set1。我理解这两种方法之间的区别是正确的吗?另外,我是否可以将[ s + [n] for s in set1]
视为由以下伪代码生成的列表?你知道吗
tmp = []
for s in set1:
tmp += [s + [n]]
问题是您正在修改在
for s in set1
循环中迭代的列表。这可以通过使用copy()来避免,以确保在列表的单独实例上迭代:for s in set1.copy()
。您还可以约束循环的长度:for s in set1[:len(set1)]
我认为你的两种方法是不相等的。你知道吗
方法二是“在计算列表之后扩展
set1
”。因此,方法2的等效值如下所示:你为什么接近我?它不是挂起,而是永远循环,因为你在遍历它的同时扩展了你的列表。你知道吗
每次你得到
set1
的下一个元素,你的set1
就会变长。你知道吗在遍历元素时更改元素确实是个坏主意。别那么做。像伪代码那样创建中间变量更安全、更清晰。你知道吗
相关问题 更多 >
编程相关推荐