2

これはバグですか、それとも機能ですか?

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の機能ですか?

よろしく

4

3 に答える 3

8

これはバグではありません、そしてそれはnumpyの初期化についてではありません、これはPythonのものです、idあなたの場合はx、y、zの両方をチェックしてください、それらは同じ要素を指しています

コードが実行しているのは、同じ行での複数の初期化です。これが発生すると、1つのオブジェクトのみが作成され、すべての変数が同じものを参照します。

以下の例を参照してください。再バインドがどのように役立つか...

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
于 2012-07-16T09:16:52.063 に答える
2

これは厄介なことではなく、標準的なPythonのことです。同じことがリストでも起こります:

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

これを行うとき:

>>> a = 5

名前「a」を別のオブジェクトに再バインドしていますが、スライスの割り当てを行うと、既存のオブジェクトの一部が所定の位置に変更されます。

于 2012-07-16T09:17:13.280 に答える
1

これはnumpyの問題ではなく、典型的なPythonの機能です。すべてがオブジェクトですが、一部のオブジェクトは変更可能で、一部は変更可能ではありません。

したがって、そうする場合は、まったく同じオブジェクトを3つの変数にx=y=z=["foo", "bar"]バインドします。つまり、参照するリストを変更して変更すると、そのオブジェクトとが指しているオブジェクトも変更されます。xyz

于 2012-07-16T09:16:57.587 に答える