在Python中> = 3.5:
x = np.zeros((2,3))
for x_e in x:
x_e += 123
此操作返回所有2x3
的{{1}}矩阵。而以下返回全零:
123
由于x = np.zeros((2,3))
for x_e in x:
x_e = 123
是来自x_e
的元素而且我并不完全感觉x
正在更新,因此这对我来说有点偏僻。
好吧,我认为这是一个问题,并且它被称为“适当的地方”。更新? (类似于就地算法?)
但是,令人震惊的是这不适用于列表:
x
返回列表
x = [0,0,0]
for x_e in x:
x_e += 123
如果有人可以告诉我这里到底发生了什么,我将不胜感激。
答案 0 :(得分:2)
在第一个代码段中,您在ndarray
对象上执行就地添加。由于每个x_e
都是ndarray
,因此就地操作会成功并改变元素。
在第二个片段中,您只是重新启动循环变量。没有对x
的元素执行任何操作。
在第三个代码段中,您没有多维数据列表,因此每个x_e
实际上都是int
。在+=
上使用int
不会就地更改,它会返回一个新的整数对象(您不会存储)。
以下内容可能与第一个更相关:
x = [[0, 0, 0] for _ in range(3)]
for x_e in x:
x_e += [123]
此处x
的每个元素都是list
对象[0, 0, 0]
,您可以在其上添加元素123
。执行后,x
将是:
[[0, 0, 0, 123], [0, 0, 0, 123], [0, 0, 0, 123]]
答案 1 :(得分:1)
想象一下你有这个:
>>> x = np.array(range(5))
>>> x
array([0, 1, 2, 3, 4])
现在:
>>> x+123
array([123, 124, 125, 126, 127])
如您所见,'+'动作映射到数组。所以,当你这样做 创建一个满0的数组,并将123添加到数组所包含的子列表中是合乎逻辑的,以获得上述结果。