2017-12-26 10 views
0

DFS 알고리즘을 구현 중이며 사전 목록을 만들고 싶습니다. 하지만 [dict()] * n을 사용하면 예기치 않은 결과가 나타납니다."[dict()] * n"과 "forappend (dict())"가있는 for 루프의 차이점은 무엇입니까?

"[dict()] * n"과 ""의 차이점을 잘 모르겠습니다.

힌트를 보내 주시면 감사하겠습니다.

def DFS1(nums, level, target, dp): 
    if level == len(nums): 
     if target == 0: 
      return 1 
     else: 
      return 0 

    if target in dp[level]: 
     return dp[level][target] 

    cnt1 = DFS1(nums, level + 1, target + nums[level], dp) 
    cnt2 = DFS1(nums, level + 1, target - nums[level], dp) 
    dp[level][target] = cnt1 + cnt2 
    return cnt1 + cnt2 

테스트 코드는 다음과 같습니다

nums = [1,1,1,1,1] 
n = len(nums) 
target = -3 
#dp = [dict()] * n #<== This does not work as expected 
dp = [] 
for i in range(0, n): 
    dp.append(dict()) 

resCnt = DFS1(nums, 0, target, dp) 
print(resCnt) 
+2

해당 사항 없음 https://stackoverflow.com/questions/240178/list-of-lists-changes-reflected-across-sublists- 예기치 않게 – user1767754

답변

2

기본적으로 무엇을 어떻게하면 만들 참조 점이다 :

x = [dict()] * 10 
print x 
>[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}] #looks fine 

x[0]['x'] = 3        #all references share same memory 
print x 
[{'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}, {'x': 3}] 

시각적으로 다음과 같은 일이 발생 :

enter image description here

referencing을 방지하기 위해 16,

, 당신은 명시 적으로 때마다 새 사전을 만들 파이썬에게 있습니다

x = [{} for x in range(10)] 
print x 
>[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 
x[0]['x'] = 3 
print x 
>[{'x': 3}, {}, {}, {}, {}, {}, {}, {}, {}, {}] 

시각적 표현 :

enter image description here

: 모든 버킷이
그것은 DICT의 자신의 복사본을입니다
+1

Cr ystal 클리어! 정말 감사합니다! – CodingNow

관련 문제