【问题标题】:Can someone please explain to me why clearing a dictionary after it's been appended to a list wipes out the list? Do I have to commit it somehow?有人可以向我解释为什么在将字典附加到列表后清除字典会清除列表吗?我必须以某种方式提交吗?
【发布时间】:2021-07-16 02:35:56
【问题描述】:

这是我正在尝试做的一个示例

profData = []
currentDic = {}

currentDic['name'] = 'Mike'
currentDic['job'] = 'Bartender'
currentDic['company'] = 'Big Bar'

profData.append(currentDic)
currentDic.clear()

currentDic['name'] = 'John'
currentDic['job'] = 'Server'
currentDic['company'] = 'Red Robin'

profData.append(currentDic)
currentDic.clear()


print(profData)
print(currentDic)

由于某种原因,我得到了这个结果

[{}, {}]
{}

我想反复使用 currentDic 将字典插入到 profData 列表中。有什么想法吗?

【问题讨论】:

  • 您确实在重复使用currentDic,而这不是您想要的。使用 currentDic = {} 而不是 .clear() 初始化一个新的。
  • 这太奇怪了。我很惊讶即使将它附加到 profData 也会清除它。不过,您绝对是对的,只是尝试过,并且有效。谢谢!
  • 没那么奇怪。 .clear() 不会初始化新对象;它只会清除现有内容的内容。您基本上是将相同的对象(不是它的副本;对象本身)两次附加到列表中。有关类似的可变对象问题,请参阅 this question
  • 只是为了再次强调@Selcuk 所说的,整个程序中只有一个列表和一个字典。您对那本词典有三个引用,但是当您更改词典时,您会在任何地方看到它。

标签: python python-3.x dictionary


【解决方案1】:

正如@Selcuk 在python 中提到的,当您创建一个变量并分配一个值时,您的变量是对该值的引用。 如果将相同的值分配给另一个变量,则会为该值创建另一个引用,而不是将值存储在新的内存地址并将其分配给变量。

在您的程序中,您创建一个字典并将其附加到一个列表中。列表中的字典将包含对上面创建的字典的相同引用。它类似于传递引用。

为避免您面临的问题,您可以将字典的副本传递给列表。

import copy

profData = []
currentDic = {}

currentDic['name'] = 'Mike'
currentDic['job'] = 'Bartender'
currentDic['company'] = 'Big Bar'

profData.append(copy.copy(currentDic)) # Use copy.deepcopy if your dictionary is nested
currentDic.clear()

currentDic['name'] = 'John'
currentDic['job'] = 'Server'
currentDic['company'] = 'Red Robin'

profData.append(currentDic)
currentDic.clear()


print(profData)
print(currentDic)

输出:

[{'name': 'Mike', 'job': 'Bartender', 'company': 'Big Bar'}, {}]
{}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多