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

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?

我正在尝试使用 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'}]

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

If there's a dictionary: a={'x':1,'y'=2} And there is a variable b which has exact value of a: 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)