1

我正在编写一个 Python 代码,它动态创建字典,将其初始化为参考字典,并修改字典中的特定值。但是,我发现不仅我得到了意想不到的结果,而且参考字典也被修改了。我的代码:

tdict={'a':'1','b':'2','c':'3'}
newdict={}
for i in range(5):
  newdict['name'+str(i)]=tdict
  newdict['name'+str(i)]['a']='value'+str(i)
  print 'tdict:  ',tdict
print 'newdict:  ',newdict

结果:

tdict:   {'a': 'value0', 'c': '3', 'b': '2'}
tdict:   {'a': 'value1', 'c': '3', 'b': '2'}
tdict:   {'a': 'value2', 'c': '3', 'b': '2'}
tdict:   {'a': 'value3', 'c': '3', 'b': '2'}
tdict:   {'a': 'value4', 'c': '3', 'b': '2'}
newdict:   {'name4': {'a': 'value4', 'c': '3', 'b': '2'}, 'name2': {'a': 'value4', 'c': '3', 'b': '2'}, 'name3': {'a': 'value4', 'c': '3', 'b': '2'}, 'name0': {'a': 'value4', 'c': '3', 'b': '2'}, 'name1': {'a': 'value4', 'c': '3', 'b': '2'}}

而我希望我的“newdict”是这样的:

newdict:   {'name4': {'a': 'value4', 'c': '3', 'b': '2'}, 'name2': {'a': 'value2', 'c': '3', 'b': '2'}, 'name3': {'a': 'value3', 'c': '3', 'b': '2'}, 'name0': {'a': 'value0', 'c': '3', 'b': '2'}, 'name1': {'a': 'value1', 'c': '3', 'b': '2'}}

谁能帮我弄清楚为什么会这样?另外,当我没有为它分配任何值时,为什么参考字典“tdict”会发生变化?

提前致谢

4

2 回答 2

2

您正在字典tdict的每个值中存储对的引用:newdict

newdict['name'+str(i)]=tdict

'a'然后,您tdict正在修改密钥

# newdict['name'+str(i)] is a reference to tdict
newdict['name'+str(i)]['a']='value'+str(i)
# this is equivalent to doing
tdict['a']='value'+str(i)

您可能想要的是将副本存储tdict在 newdict 字典中:

newdict['name'+str(i)]=dict(tdict)

通过使用现有字典作为构造函数参数来创建新字典会创建一个浅拷贝,您可以在其中为现有键分配新值。您不能(或您不想要的)是修改此字典中的可变值。例子:

>>> a={'a': 1, 'b': 2, 'c': [1,2,3]}
>>> b=dict(a)
>>> b['a']=9
>>> a
{'a': 1, 'c': [1, 2, 3], 'b': 2}
>>> b
{'a': 9, 'c': [1, 2, 3], 'b': 2}
>>> b['c'].append(99)
>>> a
{'a': 1, 'c': [1, 2, 3, 99], 'b': 2}
>>> b
{'a': 9, 'c': [1, 2, 3, 99], 'b': 2}

如果要修改字典中的可变值,则需要创建深层副本:

>>> import copy
>>> a={'a': 1, 'b': 2, 'c': [1,2,3]}
>>> b=copy.deepcopy(a)
>>> b['a']=9
>>> b['c'].append(99)
>>> a
{'a': 1, 'c': [1, 2, 3], 'b': 2}
>>> b
{'a': 9, 'c': [1, 2, 3, 99], 'b': 2}
于 2012-08-21T10:49:04.363 回答
0

只是因为您引用的是 tdict 而不是副本。为了复制,您可以使用

newdict['name'+str(i)] = tdict.copy()

或者

newdict['name'+str(i)] = dict(tdict)

希望能帮助到你

于 2012-08-21T10:52:06.780 回答