Перебор списка массивов и изменение элементов списка через итератор - PullRequest
0 голосов
/ 25 мая 2019

Я наткнулся на кусок кода, который, по моему мнению, не должен был работать. Я перебираю список массивов Numpy и хочу обрезать его содержимое. Для манипулирования списком используется итератор.

Насколько я понимаю, итератору цикла for присваиваются значения в списке. Следовательно, изменение значения итератора не должно влиять на сам список. В показанном примере кода используется функция numpy clip, и итератор назначается параметру out для отсечения на месте. Аналогично этому я делаю то же самое для некоторых чисел и использую оператор на месте iadd.

#Clip the arrays
a=np.array([4,5,1])
b=np.array([-4,3,-2])
c=np.array([3,4,-5])
print("Array before clipping:",a,b,c)
for iterator in [a, b, c]:
   np.clip(iterator, -3,3,out=iterator)
print("Array after clipping:",a,b,c)

#doing in-place calculation
d=3
e=4
print("Numbers before clipping:",d,e)
for iterator2 in [d,e]:
    iterator2 = operator.iadd(iterator2,2)
print("Numbers after clipping:",d,e)

Я ожидаю, что списки не будут изменены. Даже операция на месте может манипулировать только расположением памяти итератора. Однако для случая отсечения список изменяется. Как это может быть?

Массив до отсечения:

[4 5 1] [-4  3 -2] [ 3  4 -5]

Массив после отсечения:

[3 3 1] [-3  3 -2] [ 3  3 -3]

Числа до отсечения:

3 4

Числа после вырезания:

3 4

1 Ответ

0 голосов
/ 25 мая 2019

Вы должны рассмотреть возможность использования copy.copy или copy.deepcopy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...