带有列表值的python字典用列表更新一个键更新具有相同lis的所有键

2024-06-16 10:01:21 发布

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

我不熟悉python字典,所以我不知道为什么会发生这种情况。基本上,问题是每当我用列表更新一个键时,它都会用列表更新字典中的所有键。 尝试,除了只有唯一的用户,所以我不认为这是问题所在

    file:
    user contact
    20b3c296-0043-3948-9c90 Stacy Armstrong
    20b3c296-0043-3948-9c90 Brian Theresa
    20b3c296-0043-3948-9c90 Miller Justin
    c9b16828-91d2-33c9-b915 Monique Porter
    c9b16828-91d2-33c9-b915 Rebecca Marky
    c9b16828-91d2-33c9-b915 Rose Chang
    a6f8a71d-7568-3552-9cf4 Mildred Linda
    a6f8a71d-7568-3552-9cf4 Josephine Larry
    a6f8a71d-7568-3552-9cf4 Henry Mildred

代码如下:

^{pr2}$

打印报表给了我:

20b3c296-0043-3948-9c90 ['Stacy Armstrong', 'Brian Theresa', 'Miller Justin']


20b3c296-0043-3948-9c90 ['Monique Porter', 'Rebecca Marky', 'Rose Chang']
c9b16828-91d2-33c9-b915 ['Monique Porter', 'Rebecca Marky', 'Rose Chang']


20b3c296-0043-3948-9c90 ['Mildred Linda', 'Josephine Larry', 'Henry Mildred']
c9b16828-91d2-33c9-b915 ['Mildred Linda', 'Josephine Larry', 'Henry Mildred']
a6f8a71d-7568-3552-9cf4 ['Mildred Linda', 'Josephine Larry', 'Henry Mildred']

尽管每次列表_联系人都不同(您可以在更新字典之前尝试打印它),但所有键值都会更新到该迭代中的最后一个列表。任何帮助都非常感谢,因为我真的不知道是什么原因造成的。在

谢谢:)


Tags: 列表字典rebeccalarryroseporterhenrymarky
1条回答
网友
1楼 · 发布于 2024-06-16 10:01:21

这是一个按引用复制的问题—所有dict—“值”都包含对同一数据的相同引用—只要使用一个引用更新数据,就可以修改所有引用的基础数据。如果你想有不同的列表,你需要复制.deepcopy当你把它写进你的口述时

您可以使用pyton对象上的id()获得一个唯一的id,以区分/比较它们是“相同”还是“不同”,如下所示:

def pp (l, s):
    """silly pretty printer"""
    print(s+"\n")
    print("    ",id(l), l)
    for n in l:
        print("        ", id(n),n) 
        if n is type(list):
            for m in n:
                print("            ",id(m),m)
    print()


data         = [ [3,4] , "aa" ]              # a list, mutable
dataWithData = [ data, data, [99,100], 1]    # contains 2 refs to data, 1 new list 
                                             # if you append to dataWithData[1] both change

pp(dataWithData, "original list [ data, data, [99,100], 1]" )

dataWithData2 = dataWithData[:]  # shallow copy

pp(dataWithData2, "shallow copy of [ data, data, [99,100], 1]" ) 

import copy
dataWithData3 = copy.deepcopy( dataWithData)
pp(dataWithData3, "deepcopyed [ data, data, [99,100], 1]")

原始列表[ data, data, [99,100], 1]

^{pr2}$

[ data, data, [99,100], 1]的浅拷贝

 # only the ref to the outer varname was changed - it is a new name but points
 # to all the old data 
 764500834888 [[[3, 4], 'aa'], [[3, 4], 'aa'], [99, 100], 1]
     764497577480 [[3, 4], 'aa'] # same
     764497577480 [[3, 4], 'aa'] # same
     764500834824 [99, 100]      # same
     1763008736 1                # same

深度复制[ data, data, [99,100], 1]

 # all were changed, so all point to "new" data
 764500835400 [[[3, 4], 'aa'], [[3, 4], 'aa'], [99, 100], 1]
     764500834952 [[3, 4], 'aa']
     764500834952 [[3, 4], 'aa']
     764498168136 [99, 100]
     1763008736 1

复制和粘贴到你的编辑器和发挥周围-改变东西和pp的各种版本,看看什么是遗留下来(或检查ID)。在

相关问题 更多 >