hel*_*ndy 0 python dictionary key key-value python-2.6
我期待我的挫败感被一些启示所覆盖 - 这是一个用于演示问题的脚本的最小版本:
首先我创建一个字典:
dic = {
'foo':{},
'bar':{}
}
Run Code Online (Sandbox Code Playgroud)
然后我们实例化一个模板字典,可以迭代地附加到以下键dic:
appendic= {
'is':'', # '' is a terminal value to be replaced later
}
Run Code Online (Sandbox Code Playgroud)
所以这里我们附加appendic到以下每个键dic:
dic['foo'] = appendic
dic['bar'] = appendic
Run Code Online (Sandbox Code Playgroud)
现在我们用有意义的东西替换终端值'':
dic['foo']['is'] = 'foo'
dic['bar']['is'] = 'bar'
Run Code Online (Sandbox Code Playgroud)
在这一点上,我的直觉告诉我,如果我们打电话:
print(dic['foo']['is']) 我们得到 'foo'
但是,相反,Python会回归'bar'到我没有训练的头脑,这是违反直觉的.
问题:
当您分配appendic两个不同的键时,Python不会复制.它改为指定引用.
其结果是,既dic['please_make_me_Foo']和dic['dont_make_him_Bar']指相同的对象.这些都不是独立的词典,它们都是同一个对象,一个appendic 还引用.
如果您希望这些是单独的词典,请创建一个副本appendic.该dict.copy()方法创建字典的浅表副本:
dic['please_make_me_Foo']= appendic.copy()
dic['dont_make_him_Bar'] = appendic.copy()
Run Code Online (Sandbox Code Playgroud)
Shallow表示创建一个新字典,并复制对包含的键和值的所有引用.
如果appendic它本身包含也是字典的值,则不会复制这些值.新副本appendic都会引用相同的值.在大多数情况下,这不是问题,因为大多数原始值(字符串,整数等)是不可变的,并且在用新的值替换这些值时,您从未注意到共享引用.