2016-07-26 33 views
0

我的代碼將崩潰,永遠運行下去:Python的功能集,想不通我的錯誤

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 

雖然我用Google搜索,並找到類似的解決方案:

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 

這裏有什麼區別?

回答

4

關鍵部分是這樣的:

for result in results: 
    results.extend([result + [num]]) 

在這裏,你遍歷results列表。一個迭代器總是有生命的東西,直到你真正達到最後纔會結束。對於列表,您可以簡單地將其想象成一個指針,它從第一個元素開始,然後繼續下一個,直到到達結尾。

除了你的情況,你在每次迭代時都向results列表添加一個元素(因爲[result + [num]]是一個元素列表)。因此,隨着迭代器繼續前進,您不斷添加一個元素到最後,確保迭代器永遠不會到達末尾。

作爲一般規則,您不應該修改您當前正在迭代的集合。所以在這種情況下,當你迭代同樣的事情時,你不應該修改results

而這正是在其他的解決以下行避免:

results.extend([result + [num] for result in results]) 

這將使用列表理解和本質上是相同的:

tmp = [] 
for result in results: 
    tmp.append(result + [num]) 
results.extend(tmp) 

正如你所看到的,results是未修改迭代它。首先創建tmp列表,然後一旦完成,results列表將通過擴展整個tmp列表進行修改。