gpt4 book ai didi

python - 使用引用词典动态创建词典时,为什么引用词典会被修改? (Python)

转载 作者:行者123 更新时间:2023-12-01 05:56:53 25 4
gpt4 key购买 nike

我正在编写一个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”会发生变化?

提前致谢

最佳答案

您正在 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}

关于python - 使用引用词典动态创建词典时,为什么引用词典会被修改? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12053218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com