我希望我的挫败感会被一些启示所掩盖-这里有一个脚本的最小版本来说明这个问题:
首先,我创建了一个字典:
dic = {
'foo':{},
'bar':{}
}
然后我们实例化一个模板字典,它可以迭代地追加
到dic
的键:
所以这里我们将appendic
附加到dic
中的每个键:
dic['foo'] = appendic
dic['bar'] = appendic
现在,我们用一些有意义的东西替换终端值“”:
dic['foo']['is'] = 'foo'
dic['bar']['is'] = 'bar'
在这一点上,我的直觉告诉我,如果我们调用:
print(dic['foo']['is'])
我们得到{
但是Python返回'bar'
。。。对我没有受过训练的头脑来说这是违反直觉的。在
问题:
appendic
是一个对象-您将对同一对象的引用分配给dic
中的两个键。所以当你改变一个,你就改变了两个。在试试这个:
^{pr2}$你做了个口述:
把它加到你的另一个句子中两次
^{pr2}$并设置单个dict的
Python_made_me
值两次但是因为它们是相同的dict,所以第二行覆盖了第一行
如果需要复制,则需要使用^{} 方法:
当您将
appendic
分配给两个不同的键时,Python不会生成副本。它指定一个引用。在因此,
dic['please_make_me_Foo']
和dic['dont_make_him_Bar']
都引用同一个对象。它们不是单独的字典,它们都是同一个对象,一个appendic
也引用。在如果您希望这些是单独的字典,请创建
appendic
的副本。dict.copy()
方法创建字典的浅拷贝:Shallow意味着创建了一个新字典,所有对键和包含的值的引用都将被复制。在
如果
appendic
本身包含也是字典的值,则不会复制这些值。新副本和appendic
将引用相同的值。在大多数情况下,这不是问题,因为大多数原始值(字符串、整数等)都是不可变的,而且在用新值替换这些值时,您不会注意到引用是共享的。在相关问题 更多 >
编程相关推荐