我有一个包含某些值的列表字典。如何在不影响其他键相同位置的值的情况下更新列表中的值?
我的代码:
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
这将更改所有键的列表 high(1( 的第 4 个 (3+1( 元素,而不是仅将其更改为键 1。
我只想更改与特定键相关的列表的值。我该怎么做?
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]
您需要复制列表
from copy import copy
然后在您的循环中:
ohlc_list[x] = [copy(open), copy(high), copy(low), copy(close)]
否则,您只需将相同的列表对象添加到所有条目。