Можете ли вы объяснить это странное «обновление» содержимого np.array внутри deque? - PullRequest
0 голосов
/ 27 апреля 2020

кажется, что этот код "обновляет" содержимое внутри deque? например,

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]) 

output =

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

... как вы можете видеть, содержимое массива внутри deque обновляется, когда массиву присваивается новое значение

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

В вашем коде есть только один load объект, каждый элемент вашей декы относится к одному и тому же и только одному. Если вы хотите, чтобы они были разными, создайте новый в каждом l oop:

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 ...
0 голосов
/ 27 апреля 2020

deque содержит ссылку на один список. Каждый элемент, который вы добавляете к buffer, продолжает указывать на один и тот же np.array, первоначально названный load.

...