词典列表的问题

时间:2018-06-10 06:47:37

标签: python

我有以下代码:

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}

1 个答案:

答案 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)