# A numpy array unexpectedly changes when changing another one despite being separate

Posted on

### Question :

A numpy array unexpectedly changes when changing another one despite being separate

I found a bug in my large code, and I simplified the issue to the case below.

Although in each step I only change `w2`, but when at each step I print out `w1`, it is also changed, because end of the first loop I assign them to be equal.
I read for this but there was written in case I make `w1 = w2[:]` it will solve the issue but it does not

``````import numpy as np
import math

w1=np.array([[1,2,3],[4,5,6],[7,8,9]])
w2=np.zeros_like(w1)
print 'w1=',w1
for n in range(0,3):
for i in range(0,3):
for j in range(0,3):
print 'n=',n,'i=',i,'j=',j,'w1=',w1
w2[i,j]=w1[i,j]*2

w1=w2[:]

#Simple tests
# w=w2[:]
# w1=w[:]

# p=[1,2,3]
# q=p[:];
# q[1]=0;
# print p
``````

The issue is that when you’re assigning values back to `w1` from `w2` you aren’t actually passing the values from `w1` to `w2`, but rather you are actually pointing the two variables at the same object.

The issue you are having

``````w1 = np.array([1,2,3])
w2 = w1

w2[0] = 3

print(w2)   # [3 2 3]
print(w1)   # [3 2 3]

np.may_share_memory(w2, w1)  # True
``````

The Solution

Instead you will want to copy over the values. There are two common ways of doing this with numpy arrays.

``````w1 = numpy.copy(w2)
w1[:] = w2[:]
``````

Demonstration

``````w1 = np.array([1,2,3])
w2 = np.zeros_like(w1)

w2[:] = w1[:]

w2[0] = 3

print(w2)   # [3 2 3]
print(w1)   # [1 2 3]

np.may_share_memory(w2, w1)   # False
``````