for循环中变量的值

时间:2014-11-13 09:28:50

标签: python python-2.7 numpy

我在for循环外定义了一个数组ab是一个在循环内被赋值为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在我明确没有改变时会被更改?

3 个答案:

答案 0 :(得分:2)

因为当您执行b = a时,只会复制引用。 ab都指向同一个对象。

如果您真的想要创建a的副本,则需要执行以下操作:

import copy
...
b = copy.deepcopy(a)

答案 1 :(得分:2)

numpy.asarray是可变的,ab指向一个位置。

>>> 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)