我的代码将崩溃并永远运行:
def subsets(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
results = [[]]
for num in nums:
for result in results:
results.extend([result + [num]])
return results
当我在谷歌上搜索时,发现了类似的解决方案:
def subsets(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
results = [[]]
for num in nums:
results.extend([result + [num] for result in results])
return results
这里有什么不同?
关键部分是:
for result in results:
results.extend([result + [num]])
在这里,您正在对results
列表进行迭代。迭代器总是有生命的东西,直到你真正到达终点才结束。对于列表,您可以简单地将其想象为一个指针,从第一个元素开始,然后一直转到下一个元素,直到它到达末尾。
除了在您的情况下,您在每次迭代中将一个元素(因为[result + [num]]
是一个单元素列表)添加到results
列表中。因此,当迭代器继续前进时,您不断在末尾添加一个元素,以确保迭代器永远不会到达末尾。
一般来说,您永远不应该修改当前正在迭代的集合。因此,在这种情况下,在迭代相同的东西时,不应该修改results
。
这正是另一个解决方案中的以下行所避免的:
results.extend([result + [num] for result in results])
这使用了列表理解,本质上等同于:
tmp = []
for result in results:
tmp.append(result + [num])
results.extend(tmp)
正如您所看到的,当对results
进行迭代时,它并没有被修改。首先创建tmp
列表,然后完成后,通过将其扩展到整个tmp
列表来修改results
列表。