【问题标题】:What is the difference between "[dict()] * n" and a "for loop with .append(dict())"? [duplicate]“[dict()] * n”和“带有.append(dict())的for循环”有什么区别? [复制]
【发布时间】:2017-12-26 00:56:31
【问题描述】:

我正在实现一个 DFS 算法,我想创建一个字典列表。但是我发现如果我使用[dict()] * n,我得到了意想不到的结果。

我不确定“[dict()] * n”和“for 循环与.append(dict())”之间的区别。

感谢任何提示。

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)

【问题讨论】:

标签: python dictionary collections


【解决方案1】:

基本上发生的是您正在创建引用:

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}]

视觉上会发生以下情况:

为了避免referencing,你必须明确告诉python每次都创建新字典:

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

视觉表示:每个桶都有它自己的自己的字典副本

【讨论】:

  • 晶莹剔透!真的很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2018-05-16
  • 2020-07-14
  • 2016-02-08
  • 2022-01-26
相关资源
最近更新 更多