2016-03-10 2 views

ответ

4

Это относится ко всем типам коллекций. Это просто связано с тем, как python обрабатывает переменные. var1 += var2 - это не то же самое, что и var1 = var1 + var2 с коллекциями. Я объясню это, насколько я понимаю, что, безусловно, может быть улучшено, поэтому любые изменения/критические замечания приветствуются.

print("1:") 
x1 = [7] 
y1 = x1 
y1 += [3] 
print("{} {}".format(x1, id(x1))) 
print("{} {}".format(y1, id(y1))) 

print("2:") 
x2 = [7] 
y2 = x2 
y2 = y2 + [3] 
print("{} {}".format(x2, id(x2))) 
print("{} {}".format(y2, id(y2))) 

Выход:

1: 
[7, 3] 40229784 # first id 
[7, 3] 40229784 # same id 
2: 
[7] 40228744 # first id 
[7, 3] 40230144 # new id 

Высказывание var1 = var1 + var2 создает новый объект с новым идентификатором. Он принимает старое значение, добавляет его ко второй переменной и присваивает его новому объекту с ИМЯ первого объекта. В примере var1 += var2 он просто добавляет его к объекту, на который указывает идентификатор, который аналогичен старой переменной.

1

В случае

W = np.array([0,1,2]) 
W1 = W 
W1 += np.array([2,3,4]) 

W указывает на некоторое место в памяти, держа Numpy массив. W1 указывает на то же место. W1 += np.array([2,3,4]) занимает это место в памяти и изменяет содержимое.

В этом случае:

W = np.array([0,1,2]) 
W1 = W 
W1 = W1 + np.array([2,3,4]) 

W и W1начинают указывая на то же место в памяти. Затем вы создаете новый массив (W1 + np.array([2,3,4])), который находится в новом месте в памяти. (Имейте в виду: правая сторона всегда оценивается сначала, и только тогда она назначается переменной с левой стороны.) Затем вы делаете W1, указываете на это новое местоположение в памяти (назначив W1 этому новому массиву). W все еще указывает на прежнее место в памяти. С этого момента W и W1 уже не совпадают.

0

По существу, + и += - это разные методы, которые может реализовать любой класс. В numpy += реализован для изменения памяти, а + возвращает новый массив.

Подробнее в this question.