这是一个错误还是一个功能?
import numpy as np
a=b=c=0
print 'a=',a
print 'b=',b
print 'c=',c
a = 5
print 'a=',a
print 'b=',b
print 'c=',c
b = 3
print 'a=',a
print 'b=',b
print 'c=',c
x=y=z=np.zeros(5)
print 'x=',x
print 'y=',y
print 'z=',z
x[2]= 10
print 'x=',x
print 'y=',y
print 'z=',z
y[3]= 20
print 'x=',x
print 'y=',y
print 'z=',z
代码的输出显示numpy初始化是彼此的克隆,而python倾向于将它们视为独立变量。
a= 0
b= 0
c= 0
a= 5
b= 0
c= 0
a= 5
b= 3
c= 0
x= [ 0. 0. 0. 0. 0.]
y= [ 0. 0. 0. 0. 0.]
z= [ 0. 0. 0. 0. 0.]
x= [ 0. 0. 10. 0. 0.]
y= [ 0. 0. 10. 0. 0.]
z= [ 0. 0. 10. 0. 0.]
x= [ 0. 0. 10. 20. 0.]
y= [ 0. 0. 10. 20. 0.]
z= [ 0. 0. 10. 20. 0.]
我希望问题很清楚。 这是numpy中的错误还是一个功能?
此致
答案 0 :(得分:8)
这不是一个bug,它不是关于numpy初始化,这是一个python的事情,
检查x,y和amp;的id
在你的情况下,z指向相同的元素
您的代码正在做的是在同一行中进行多次初始化,当发生这种情况时,只创建了一个对象,并且所有变量都引用相同的。
请参阅以下示例,重新绑定有助于...
In [19]: a=b=[1,2,3]
In [20]: a
Out[20]: [1, 2, 3]
In [21]: b
Out[21]: [1, 2, 3]
In [22]: a[1]
Out[22]: 2
In [23]: a[1] = 99
In [24]: a
Out[24]: [1, 99, 3]
In [25]: b
Out[25]: [1, 99, 3]
In [26]: id(a)
Out[26]: 27945880
In [27]: id(b)
Out[27]: 27945880
In [28]: a = a[:] # This is Rebinding
In [29]: a
Out[29]: [1, 99, 3]
In [30]: id(a)
Out[30]: 27895568 # The id of the variable is changed
答案 1 :(得分:2)
这不是一个笨拙的东西,它是一个标准的Python东西。列表也会出现同样的情况:
>>> a = b = []
>>> a.append(5)
>>> a
[5]
>>> b
[5]
>>> a[0] = 10
>>> a
[10]
>>> b
[10]
执行此操作时:
>>> a = 5
您将名称“a”重新绑定到另一个对象 - 但是当您执行切片分配时,您将修改现有对象的一部分。
答案 2 :(得分:1)
这不是numpy的问题,这是一个典型的Python特性:一切都是对象,但有些对象是可变的,有些则不是。
因此,如果您执行x=y=z=["foo", "bar"]
,则将完全相同的对象绑定到三个变量。这意味着如果您通过改变引用的列表来更改x
,则也会更改y
和z
所指向的对象。