我的代码会崩溃并永远运行:
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
这有什么区别?
答案 0 :(得分:4)
关键部分是:
$1
在这里,您将遍历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
列表将通过整个results
列表进行修改来修改。