我今天发现了一件奇怪的事情,想知道是否有人可以阐明这里的区别是什么?
import numpy as np
A = np.arange(12).reshape(4,3)
for a in A:
a = a + 1
B = np.arange(12).reshape(4,3)
for b in B:
b += 1
运行每个 for
循环后, A
没有改变,但是 B
已经为每个元素添加了一个。我实际上使用 B
版本写入 for
循环中的初始化 NumPy 数组。
原文由 Dammi 发布,翻译遵循 CC BY-SA 4.0 许可协议
不同之处在于,一个修改数据结构本身(就地操作)
b += 1
而另一个只是 重新分配 变量a = a + 1
。只是为了完整性:
x += y
并不总是 在进行就地操作,有(至少)三个例外:If
x
doesn’t implement an__iadd__
method then thex += y
statement is just a shorthand forx = x + y
.如果x
类似于int
--- 就会出现这种情况。如果
__iadd__
返回NotImplemented
,Python 回落到x = x + y
。__iadd__
方法理论上可以实施,但不能在适当的地方工作。不过,这样做真的很奇怪。碰巧你的
b
s 是numpy.ndarray
s 实现__iadd__
并返回它自己所以你的第二个循环修改原始数组。您可以在 “模拟数字类型”的 Python 文档中 阅读更多相关信息。