我有以下代码:
n=4
arr=['abcd', 'abce', 'abcdex', 'abcde']
mainarr=[{}]
dic={}
for i in range(1,n+1):
insert(dic,arr[i-1]+' ') #insert is a function that modifies dic
print(dic) #to see whats the current dic
mainarr.append(dic.copy())
所以我得到了mainarr
现在的问题是,不知何故,mainarr的第一个和第二个元素与预期相同,但其余三个条目都相同,并且等于应该是mainarr的最后一个元素的值..... plz help我发现什么是错的!!!
输出
{'a': 'abcd '}
{'a': {'b': {'c': {'d': 'abcd ', 'e': 'abce '}}}}
{'a': {'b': {'c': {'d': {' ': 'abcd ', 'e': 'abcdex '}, 'e': 'abce '}}}}
{'a': {'b': {'c': {'d': {' ': 'abcd ', 'e': {'x': 'abcdex ', ' ': 'abcde
'}}, 'e': 'abce '}}}}
所以每次迭代后dic值都是正确的
但是主要是
[{}, {'a': 'abcd '}, {'a': {'b': {'c': {'d': {' ': 'abcd ', 'e': {'x':
'abcdex ', ' ': 'abcde '}}, 'e': 'abce '}}}}, {'a': {'b': {'c': {'d': {' ':
'abcd ', 'e': {'x': 'abcdex ', ' ': 'abcde '}}, 'e': 'abce '}}}}, {'a':
{'b': {'c': {'d': {' ': 'abcd ', 'e': {'x': 'abcdex ', ' ': 'abcde '}}, 'e':
'abce '}}}}] #as you can see, first two elements are correct, but last 3 are
equal to final value of dic
如果有帮助,插入代码是
def insert(dic,string,depth=0):
if type(dic)==dict:
if string[depth] in dic.keys():
dic[string[depth]]=insert(dic[string[depth]],string,depth+1)
return dic
else:
dic[string[depth]]=string
return dic
else:
if dic[depth]==string[depth]:
return {dic[depth]:insert(dic,string,depth+1)}
else:
return {dic[depth]:dic,string[depth]:string}
答案 0 :(得分:0)
dic.copy()
仅复制字典而不复制其内容。您可以使用copy.deepcopy
模块中的copy
代替。但还有另一种方法是将复制移动到插入函数中,以便它始终返回一个副本。
您的插入函数会改变字典:
if string[depth] in dic.keys():
dic[string[depth]]=insert(dic[string[depth]],string,depth+1)
return dic
else:
dic[string[depth]]=string
return dic
如果你在插入函数中复制一次,问题就会消失:
dic = dic.copy()
if string[depth] in dic.keys():
dic[string[depth]]=insert(dic[string[depth]],string,depth+1)
return dic
else:
dic[string[depth]]=string
return dic
结果是insert函数总是返回一个副本,然后你的主循环应该如下所示:
for i in range(1,n+1):
dic = insert(dic, arr[i-1]+' ') # returns a copy that is mutated
print(dic) #to see whats the current dic
mainarr.append(dic)