在使用引用词典动态创建词典时,为什么要修改引用词典?(Python)

2024-09-27 22:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个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:   {'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'在我没有给它赋值的情况下会发生变化?你知道吗

提前谢谢


Tags: 代码name字典printvalue1strvalue2tdict
2条回答

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

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

然后修改tdict的键'a',方法是

# 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)

您可能希望在newdict字典中存储tdict的副本:

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}

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

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

或者

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

希望有帮助

相关问题 更多 >

    热门问题