首页 > 解决方案 > 你能解释一下双端队列中 np.array 内容的这种奇怪的“更新”吗?

问题描述

这段代码似乎“更新”了双端队列中的内容?例如

import numpy as np
from collections import deque

buffer = deque()
load = np.array([1])

for loop in range(5):     
    print(list(buffer))  
    print("   >>>>> load[0] = loop # .... ...")
    load[0] = loop
    print(list(buffer))              
    print("   >>>>> buffer.append ...")
    buffer.append([loop, load]) 

输出 =

[]
   >>>>> load[0] = loop # .... ...
[]
   >>>>> buffer.append ...
[[0, array([0])]]
   >>>>> load[0] = loop # .... ...
[[0, array([1])]]
   >>>>> buffer.append ...
[[0, array([1])], [1, array([1])]]
   >>>>> load[0] = loop # .... ...
[[0, array([2])], [1, array([2])]]
   >>>>> buffer.append ...
[[0, array([2])], [1, array([2])], [2, array([2])]]
   >>>>> load[0] = loop # .... ...
[[0, array([3])], [1, array([3])], [2, array([3])]]
   >>>>> buffer.append ...
[[0, array([3])], [1, array([3])], [2, array([3])], [3, array([3])]]
   >>>>> load[0] = loop # .... ...
[[0, array([4])], [1, array([4])], [2, array([4])], [3, array([4])]]
   >>>>> buffer.append ...

...如您所见,当数组被分配新值时,双端队列中的数组内容会更新?

标签: pythonarraysnumpydeque

解决方案


你的代码中只有一个load对象,你的双端队列的每个项目都引用这个相同的,并且只有一个。如果您希望它们不同,请在每个循环中创建一个新的:

import numpy as np
from collections import deque

buffer = deque()


for loop in range(5):     
    print(list(buffer))  
    print("   >>>>> load[0] = loop # .... ...")
    load = np.array([loop])
    print(list(buffer))              
    print("   >>>>> buffer.append ...")
    buffer.append([loop, load]) 

输出:

[]
   >>>>> load[0] = loop # .... ...
[]
   >>>>> buffer.append ...
[[0, array([0])]]
   >>>>> load[0] = loop # .... ...
[[0, array([0])]]
   >>>>> buffer.append ...
[[0, array([0])], [1, array([1])]]
   >>>>> load[0] = loop # .... ...
[[0, array([0])], [1, array([1])]]
   >>>>> buffer.append ...
[[0, array([0])], [1, array([1])], [2, array([2])]]
   >>>>> load[0] = loop # .... ...
[[0, array([0])], [1, array([1])], [2, array([2])]]
   >>>>> buffer.append ...
[[0, array([0])], [1, array([1])], [2, array([2])], [3, array([3])]]
   >>>>> load[0] = loop # .... ...
[[0, array([0])], [1, array([1])], [2, array([2])], [3, array([3])]]
   >>>>> buffer.append ...

推荐阅读