2012-07-16 73 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」到一個不同的對象 - 但是當你做切片作業,正在修改現有物體的一部分就位。