提问人:Adhi 提问时间:5/22/2022 更新时间:5/22/2022 访问量:35
为什么我的切片不更改列表中指向字典的值,而是更改列表中所有字典的值?
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'}]
答:
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
评论
p_list
包含对同一 Dictionary 对象的三个引用。当一个人改变时,它们都会改变,因为它们是同一个对象。