我在for循环外定义了一个数组a
。 b
是一个在循环内被赋值为a
的变量。我更改了循环内b
的值,这也改变了a
。为什么/如何发生这种情况?
>>> import numpy as np
>>> a = np.asarray(range(10))
>>> for i in range(5,7):
b = a #assign b to be equal to a
b[b<i]=0 #alter b
b[b>=i]=1
print a
输出:
[0 0 0 0 0 1 1 1 1 1] #Unexpected!!
[0 0 0 0 0 0 0 0 0 0]
为什么a
在我明确没有改变时会被更改?
答案 0 :(得分:2)
因为当您执行b = a
时,只会复制引用。 a
和b
都指向同一个对象。
如果您真的想要创建a
的副本,则需要执行以下操作:
import copy
...
b = copy.deepcopy(a)
答案 1 :(得分:2)
numpy.asarray
是可变的,a
和b
指向一个位置。
>>> a = [1,2,3]
>>> b = a
>>> id(a)
140435835060736
>>> id(b)
140435835060736
您可以像b = a[:]
或b = copy.deepcopy(a)
id
返回对象的“标识”。
答案 2 :(得分:1)
使用 slice 运算符制作副本。 =
只是在复制引用时给它另一个名字。
b = a[:]
工作正常。
根据@AshwiniChaudhary的评论,这对于Numpy阵列不起作用,本例中的解决方案是
b = copy.deepcopy(a)