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.为什么?
几乎任何类型的集合都是如此.这只是因为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指向的对象,该对象与旧变量相同.
如果是
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)
W并W1 开始指向内存中的同一位置。然后,您创建一个新数组 ( W1 + np.array([2,3,4])),该数组位于内存中的新位置。(请记住:始终首先评估右侧,然后才将其分配给左侧的变量。)然后,您指向W1内存中的这个新位置(通过分配W1给这个新数组)。W仍然指向内存中的旧位置。从此时起,W和W1不再是同一个数组。