2

Is this a bug or a feature?

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

The output of the code shows me that the numpy initializations are clones of each other while python tends to treat them as independent variable.

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.]

I hope the problem is clear. Is this a bug or a feature in numpy?

Regards

3 Answers 3

8

this is not a bug,, and it is not about numpy initialization, this is a python thing,, check id of both x,y & z in your case, they point to same element

What your code is doing is multiple initialization in the same line, when this happens, only 1 object is created and all the variables refer to the same.

See the below example, how rebinding helps...

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
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks!! I understand my confusion now !
2

This isn't a numpy thing, its a standard Python thing. The same will happen with lists:

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

When you do this:

>>> a = 5

You are rebinding the name 'a' to a different object - but when you do slice assignment, you're modifying part of the existing object in place.

Comments

1

This is not numpy's problem, this is a typical Python feature: Everything is an object, but some objects are mutable and some aren't.

So if you do x=y=z=["foo", "bar"], you bind the exact same object to the three variables. This means that if you change x by mutating the list it references, you change the object that y and z are pointing to, too.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.