2016-07-26 7 views
0

내 코드가 충돌 영원히 실행됩니다 : 비슷한 솔루션파이썬 전원 집합 알아낼 수 없습니다 내 오류

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 

를? 당신이 results 목록 반복되어, 여기에

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

:

답변

4

결정적인 부분이있다. 반복자는 항상 살아있는 무언가이며 실제로 끝날 때까지 끝내지 않습니다. 목록의 경우 첫 번째 요소에서 시작하여 끝까지 도달 할 때까지 다음 요소로 계속 이동하는 포인터로 이것을 상상할 수 있습니다.

귀하의 경우를 제외하고는 모든 반복마다 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 목록으로 확장되어 수정됩니다.