Я наткнулся на кусок кода, который, по моему мнению, не должен был работать. Я перебираю список массивов 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