【问题标题】:How to grow a list of dictionaries in Python如何在 Python 中增加字典列表
【发布时间】:2022-11-09 03:57:21
【问题描述】:

以下演示代码:

mydict = {}
mylist = []

mydict["s"] = 1
mydict["p"] = "hasprice"
mydict["o"] = 3
print(mydict)
mylist.append(mydict)

mydict["s"] = 22
mydict["p"] = "hasvat"
mydict["o"] = 66
print(mydict)
mylist.append(mydict)

print(mylist)

打印出以下结果:

[{'s': 22, 'p': 'hasvat', 'o': 66}, {'s': 22, 'p': 'hasvat', 'o': 66}]

我想到的唯一解释是 mydict 是通过引用分配的,因此列表项都指向同一个内存对象。这是原因吗?

如何正确地将多个不同的字典附加到列表中?

我在一个循环中构建每个 mydict 字典,然后想将它附加到我最终将写入 JSON 文件的列表中。

【问题讨论】:

  • 正确的。该列表包含两次相同的 dict 对象。
  • 如果像您的示例一样,每个字典的键都相同,您可以编写一个函数,将值作为参数并使用公共键和新值构造一个新字典。像make_dict(22,"hasvat",66) 这样的东西。作为一个额外的好处,这将避免您面临的混叠问题。
  • id 函数是一个很好的函数,用于测试两个事物是否指向同一个对象。评估id(mydict[0])id(mydict[1]) 将证实您对列表项指向同一事物的正确怀疑。

标签: python


【解决方案1】:
mylist.append(mydict)

那么,你在这里做什么?您正在附加一个 dict 对象,对吧?

问题是在 Python 中 dict 是一个可变类型,它通过引用传递。

这就是为什么当您编辑mydict 时,您也在编辑mylist[0],因为它们都引用同一个对象。


要实现我认为您想要做的事情,只需执行以下操作:

mylist.append(mydict.copy())

这将创建一个不再引用mydict 的副本。

应该在第一次调用.append 时完成复制,否则无论如何你都会得到两个相同的dicts,正如@sj95126 指出的那样。


为了更好地理解我的回答,我强烈建议阅读以下内容:

【讨论】:

  • 可能想澄清您是在第一个 append() 还是第二个中复制字典。在第二个append() 中,值已更改。
  • 非常感谢。非常清晰,也很有启发性。我更喜欢这个解决方案,因为在我的应用程序中 mydict["s"] 被初始化为一个长的复杂哈希,它永远不会改变,只有 p 和 o 会改变。
【解决方案2】:
mydict = {}
mylist = []

mydict["s"] = 1
mydict["p"] = "hasprice"
mydict["o"] = 3
print(mydict)
mylist.append(mydict)

mydict = {}  # This is a second dictionary

mydict["s"] = 22
mydict["p"] = "hasvat"
mydict["o"] = 66
print(mydict)
mylist.append(mydict)

print(mylist)

你会得到:

[{'s': 1, 'p': 'hasprice', 'o': 3}, {'s': 22, 'p': 'hasvat', 'o': 66}]

【讨论】:

  • 非常感谢大卫。所以新的初始化确实分配了一个新的内存空间,对吧?非常清楚。我赞成您更简单的解决方案,但选择了 FLAK 作为答复,因为在我的实际应用程序中,字典的第一个成员被初始化为一个永远不会改变的长哈希,并且我不必在循环中每次都重新分配它。
猜你喜欢
  • 2020-12-06
  • 2010-12-14
  • 2020-12-06
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多