为什么python/numpy + =改变原始数组?

hen*_*nry 8 python numpy

import numpy as np

W = np.array([0,1,2])
W1 = W
W1 += np.array([2,3,4])
print W

W = np.array([0,1,2])
W1 = W
W1 = W1 + np.array([2,3,4])
print W
Run Code Online (Sandbox Code Playgroud)

上面的代码会发生变异W,但较低的代码不会发生变异W.为什么?

Goo*_*ies 5

几乎任何类型的集合都是如此.这只是因为python处理变量的方式.var1 += var2是不一样的var1 = var1 + var2使用集合.据我所知,我会解释它,当然可以改进,因此欢迎任何编辑/批评.

print("1:")
x1 = [7]
y1 = x1
y1 += [3]
print("{} {}".format(x1, id(x1)))
print("{} {}".format(y1, id(y1)))

print("2:")
x2 = [7]
y2 = x2
y2 = y2 + [3]
print("{} {}".format(x2, id(x2)))
print("{} {}".format(y2, id(y2)))
Run Code Online (Sandbox Code Playgroud)

输出:

1:
[7, 3] 40229784 # first id
[7, 3] 40229784 # same id
2:
[7]    40228744 # first id
[7, 3] 40230144 # new id
Run Code Online (Sandbox Code Playgroud)

Saying var1 = var1 + var2使用新ID创建一个新对象.它接受旧值,将其添加到第二个变量,并使用第一个对象的NAME将其分配给新对象.在该var1 += var2示例中,它只是将其附加到ID指向的对象,该对象与旧变量相同.


acd*_*cdr 5

如果是

W = np.array([0,1,2])
W1 = W
W1 += np.array([2,3,4])
Run Code Online (Sandbox Code Playgroud)

W指向内存中的某个位置,保存一个 numpy 数组。W1指向同一位置。W1 += np.array([2,3,4])获取内存中的该位置并更改内容。

在这种情况下:

W = np.array([0,1,2])
W1 = W
W1 = W1 + np.array([2,3,4])
Run Code Online (Sandbox Code Playgroud)

WW1 开始指向内存中的同一位置。然后,您创建一个新数组 ( W1 + np.array([2,3,4])),该数组位于内存中的新位置。(请记住:始终首先评估右侧,然后才将其分配给左侧的变量。)然后,您指向W1内存中的这个新位置(通过分配W1给这个新数组)。W仍然指向内存中的旧位置。从此时起,WW1不再是同一个数组。