为什么我的切片没有改变列表中指向的字典的值,而是改变了我列表中所有字典的值?
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)
我正在尝试使用 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)