Для скаляра:
In [128]: x = 23.2
In [129]: id(x)
Out[129]: 140067097316640
In [130]: x += 12
In [131]: x
Out[131]: 35.2
In [132]: id(x)
Out[132]: 140067097315080
+ = присвоил переменной новый номер.
Для массива:
In [133]: x = np.ones(3)
In [134]: x
Out[134]: array([1., 1., 1.])
In [135]: id(x)
Out[135]: 140067132298464
In [136]: x.__array_interface__['data']
Out[136]: (140067416761584, False)
In [137]: x += 12
In [138]: id(x)
Out[138]: 140067132298464
In [139]: x.__array_interface__['data']
Out[139]: (140067416761584, False)
In [140]: x
Out[140]: array([13., 13., 13.])
добавление изменяет значения, но не объект массива (id) или даже его буфер данных. Действие все на месте.
Для списка +=
может изменить элемент списка без изменения остальной части списка:
In [141]: x = [1,2,3]
In [142]: x[1] +=12
In [143]: x
Out[143]: [1, 14, 3]
То же самое для Python Скалярное обозначение i += 1
является сокращенным синтаксическим c, но не меняет вычисления (но было бы хорошо взглянуть на сгенерированный байт-код).
Однако, как указано в np.ufunc.at
документы,
https://numpy.org/doc/stable/reference/generated/numpy.ufunc.at.html#numpy .ufun c .at
, действие массива +=
буферизовано. x+=12
на самом деле x[:] = x+12
.