为什么我的切片不更改列表中指向字典的值,而是更改列表中所有字典的值?

Why does my slice do not change the values of the pointed dictionary in list but changes the values of all the dictionaries in my list?

提问人:Adhi 提问时间:5/22/2022 更新时间:5/22/2022 访问量:35

问:

我试图使用for循环只更改列表中三个相同字典中的一个,以准确切出列表中的第二个字典。但是不知何故,我列表中所有 3 个字典的值都在变化,就好像我没有正确切片一样。我错过了什么?

法典:

p1 = {
    'fn': 'kan',
    'ln': 'go',
    'icolor': 'brown',
    'age': 3.5,
    'location': 'CA',
    }


p_list = []

for i in range(0,3):
    p_list.append(p1)


for p_info in p_list[1:2]:
    if p_info['fn'] == 'kan':
        p_info['fn'] = 'ad'
        p_info['ln'] = 'se'
        p_info['icolor'] = 'brown'
        p_info['age'] = 30
        p_info['location'] = 'CN'

print(p_list)

实际输出:

[{'fn': 'ad', 'ln': 'se', 'icolor': 'brown', 'age': 30, 'location': 'CN'}, {'fn': 'ad', 'ln': 'se', 'icolor': 'brown', 'age': 30, 'location': 'CN'}, {'fn': 'ad', 'ln': 'se', 'icolor': 'brown', 'age': 30, 'location': 'CN'}]

预期输出:

[{'fn': 'kan', 'ln': 'go', 'icolor': 'brown', 'age': 3.5, 'location': 'CA'}, {'fn': 'ad', 'ln': 'se', 'icolor': 'brown', 'age': 30, 'location': 'CN'}, {'fn': 'kan', 'ln': 'go', 'icolor': 'brown', 'age': 3.5, 'location': 'CA'}]
python 列表 字典 切片

评论

1赞 John Gordon 5/22/2022
p_list包含对同一 Dictionary 对象的三个引用。当一个人改变时,它们都会改变,因为它们是同一个对象。
0赞 Nick 5/22/2022
这回答了你的问题吗?更改一个字典会更改字典列表中的所有字典

答:

0赞 user19169819 5/22/2022 #1

这是因为列表的所有三个元素都是相同的引用对象。对一个词典所做的任何更改都将更改所有三个词典中的元素。例:

如果有字典: 并且有一个变量 b,其确切值为 a:a={'x':1,'y'=2}b=a

对 a 所做的任何更改也会影响 b,反之亦然。但是,如果您想保持它们的独立性,我们需要通过方法创建它的副本。如果键入:copy()

b=a.copy()

现在,所做的任何更改都不会影响对方。你的代码也是如此。我们需要创建字典的三个副本,您可以通过以下命令完成:

p_list = [p1.copy() for i in range(3)]

因此,您的新代码将是:

p1 = {
    'fn': 'kan',
    'ln': 'go',
    'icolor': 'brown',
    'age': 3.5,
    'location': 'CA',
    }


p_list = [p1.copy() for i in range(3)]



for p_info in p_list[1:2]:
    if p_info['fn'] == 'kan':
        p_info['fn'] = 'ad'
        p_info['ln'] = 'se'
        p_info['icolor'] = 'brown'
        p_info['age'] = 30
        p_info['location'] = 'CN'

print(p_list)

评论

0赞 Adhi 5/22/2022
非常感谢。这是非常有帮助的。那么,说我用来创建p_list的'append()'方法没有复制字典,而只是将p_list[1]和p_list[2]元素设置为p1,这是对的吗?
0赞 5/22/2022
是的,你可以这么说。关键是列表的每个索引的值是同一个对象。其中的任何变化都将反映在所有变化中。如果你觉得它有帮助,那么你可以通过点赞来振作起来
0赞 Adhi 9/21/2022
谢谢伙计。我是新来的,所以它没有记录我的赞成票。+1