簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM