Python中的for对象更新for循环

时间:2017-03-19 18:30:56

标签: python python-3.x numpy

在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

如果有人可以告诉我这里到底发生了什么,我将不胜感激。

2 个答案:

答案 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添加到数组所包含的子列表中是合乎逻辑的,以获得上述结果。