2012-07-16 76 views
2

这是一个错误或功能?Python的numpy bug或功能

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功能?

问候

回答

8

这是不是一个错误,,它是不是numpy的初始化,这是一个Python的事情,, 检查了x id,Y &ž你的情况,它们指向同一个元素

你的代码正在做的是在同一行中进行多次初始化,当发生这种情况时,只创建一个对象,并且所有变量都指向相同的对象。

请参见下面的示例中,重新绑定如何帮助...

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 
+0

谢谢! 我现在明白我的困惑! – abcd 2012-07-16 09:24:36

1

这不是numpy的的问题,这是一个典型的Python的特点:一切都是对象,但有些对象是可变的,有些是不。

所以,如果你做x=y=z=["foo", "bar"],你绑定完全相同的对象三个变量。这意味着如果您通过改变其引用的列表来更改x,则您也会更改yz指向的对象。

2

这不是一个numpy的东西,它是一个标准的Python东西。同样将列出发生:

>>> a = b = [] 
>>> a.append(5) 
>>> a 
[5] 
>>> b 
[5] 
>>> a[0] = 10 
>>> a 
[10] 
>>> b 
[10] 

当你这样做:

>>> a = 5 

你重新绑定名称“a”到一个不同的对象 - 但是当你做切片作业,正在修改现有物体的一部分就位。