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

这不是 numpy 的东西,它是标准的 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 特性:一切都是对象,但有些对象是可变的,有些则不是。

因此,如果您这样做,则将完全相同的对象x=y=z=["foo", "bar"]绑定到三个变量。这意味着如果你通过改变它引用的列表来改变,你也改变了和指向的对象。xyz

于 2012-07-16T09:16:57.587 回答