Независимо от того, какой объект мы перебирали или как этот объект был реализован, для x = 2*x
было бы почти невозможно сделать что-нибудь полезное для этого объекта. x = 2*x
- присвоение переменной x
; даже если предыдущее содержимое переменной x
было получено путем итерации по некоторому объекту, новое присвоение x
не повлияет на объект, по которому мы выполняем итерацию.
В этом конкретном случае, итерируя по массиву NumPy с np.nditer(a, op_flags = ['readwrite'])
, каждая итерация цикла устанавливает x
в нульмерный массив, который является доступным для записи представление ячейки a
, x[...] = 2*x
записывает содержимое нулевого массива, а не связывает переменную x
. Поскольку массив является представлением ячейки a
, это присваивание записывает в соответствующую ячейку a
.
Это очень похоже на разницу между l = []
и l[:] = []
с обычными списками, где l[:] = []
очистит существующий список, а l = []
заменит список новым пустым списком без изменения оригинала. Однако списки не поддерживают представления или нульмерные списки.