2014-11-13 2 views
1

У меня есть массив a, определенный вне цикла for. b - это переменная, которая должна быть равна a внутри цикла. Я изменяю значения b внутри цикла, который также изменяет a. Почему/Как это происходит?Значения переменных внутри цикла for

>>> import numpy as np 
>>> a = np.asarray(range(10)) 
>>> for i in range(5,7): 
     b = a   #assign b to be equal to a 
     b[b<i]=0  #alter b 
     b[b>=i]=1 
     print a 

Выход:

[0 0 0 0 0 1 1 1 1 1] #Unexpected!! 
[0 0 0 0 0 0 0 0 0 0] 

Почему a изменяется, когда я явно не сделать это?

ответ

2

Потому что, когда вы делаете b = a, копируется только ссылка. Оба a и b указывают на тот же объект.

Если вы действительно хотите создать копию a вам нужно сделать, например:

import copy 
... 
b = copy.deepcopy(a) 
+1

Поскольку 'a' является массивом Numpy, просто' b = a.copy() 'достаточно. –

+0

Ограничено ли это только петлями? , когда я делаю a = 5 b = a b + = 1 print a. Вывод по-прежнему 5 –

1

Используйте срез оператора сделать копию. = просто дает ему другое имя, копируя ссылки.

b = a[:] 

Будет работать нормально.


Согласно @ AshwiniChaudhary свой комментарий, это не будет работать для Numpy массивов, решение в данном случае является

b = copy.deepcopy(a) 
+0

Срезание возвращает представление в случае, если массивы Numpy не копируются. –

+0

@AshwiniChaudhary Не заметил Numpy, спасибо. Ред. – Maroun

2

numpy.asarray изменчиво так, a и b указал одно место.

>>> a = [1,2,3] 
>>> b = a 
>>> id(a) 
140435835060736 
>>> id(b) 
140435835060736 

Вы можете исправить как этот b = a[:] или b = copy.deepcopy(a)

id возвращает «идентичность» объекта.

+0

Являются ли идентификаторы одинаковыми только для списков/массивов? –

+1

@AdarshChavakula Python не имеет собственной структуры данных массива, но имеет список, который является гораздо более общим и может быть легко использован как многомерный массив. –