如何在python中的列表字典中更改值

时间:2018-10-08 11:01:07

标签: python dictionary

我有一个包含某些值的列表字典。如何在不影响其他键相同位置的值的情况下更新列表中的值?

我的代码:

open = []
high = []
low = []
close = []  

ohlc_list = {}

for i in range(0,20):
   open.append(0)
   close.append(0)
   high.append(0)
   low.append(0)


for x in range(0,5):
   ohlc_list[x] = [open,high,low,close] 

ohlc_list[1][1][3] = 0  

这将更改所有键的列表高位(1)的第4(3 + 1)个元素,而不是仅更改键1。

我只想更改与特定键相关的列表的值。我怎么做?

2 个答案:

答案 0 :(得分:3)

for x in range(0, 5):
   ohlc_list[x] = [open , high , low, close]

这没有做您认为做的事。它为相同的4个列表创建5个引用,并将这些引用保留在不同的键下。

这可以通过以下循环显示:

for value in ohlc_list.values():
    print([id(inner_list) for inner_list in value])

# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]
# [2446702057416, 2446702057544, 2446692440648, 2446702057480]

我们看到所有内部列表都具有相同的id,这意味着它们都引用内存中的相同位置(故意过分简化)。

您想要的是这些列表的5个副本。您可以使用一个空切片([:])或copy来实现此目的:

for x in range(0, 5):
   ohlc_list[x] = [open[:], high[:], low[:], close[:]] 

如果再次打印内部列表的所有ID,我们会看到现在实际上在内存中有不同的列表:

# [2592165177544, 2592165177480, 2592165177416, 2592165177352]
# [2592165177672, 2592165177736, 2592165177800, 2592165177864]
# [2592165177992, 2592165178056, 2592165178120, 2592165178184]
# [2592165178312, 2592165178376, 2592165178440, 2592165178504]
# [2592165178632, 2592165178696, 2592165178760, 2592165178824]

答案 1 :(得分:1)

您需要复制列表

from copy import copy

,然后在您的循环中:

ohlc_list[x] = [copy(open), copy(high), copy(low), copy(close)]

否则,您只是将相同的列表对象添加到所有条目中。