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
不再是同一个数组。
归档时间: |
|
查看次数: |
5396 次 |
最近记录: |