[英]Why is this dictionary comprehension for list of dictionaries not returning values?
[英]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'}]
這是因為列表的所有三個元素都是相同的引用對象。 對一個字典所做的任何更改都會更改所有三個字典中的元素。 例子:
如果有字典:
a={'x':1,'y'=2}
並且有一個變量 b 具有 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.