2016-02-20 50 views
0

的陣列ynzn是等於numericaly講,但有一個奇怪的區別: 行yn += 7,如預期,不改變tn陣列,但倒數第二行zn += 7改變tn陣!Python就地操作符(如「+ =」),numpy數組和標識函數無法正常工作?

這是代碼:

import numpy as np 
def f(x): return (1*x) 
def g(x): return (x) 
nn = 5 
tn = np.zeros(nn) 
yn = np.zeros(nn) 
zn = np.zeros(nn) 

tn = np.linspace(0,1,nn) 
yn = f(tn) 
zn = g(tn) 

print('tn at step1 =',tn) 
yn += 7 #as expected, this line does not change tn. 
print('tn at step2 =',tn) 
zn += 7 #why this line adds 7 to tn array?! 
print('tn at step3 =',tn) 

的輸出是:

tn at step1 = [ 0. 0.25 0.5 0.75 1. ] 
tn at step2 = [ 0. 0.25 0.5 0.75 1. ] 
tn at step3 = [ 7. 7.25 7.5 7.75 8. ] *why is 7 added to tn array?!* 

通知所涉及:

  • numpy的陣列
  • G(X)爲恆等函數
  • 就地IADD運算符(+ =)

雖然我已經解決了使用zn = zn + 7這個問題,而不是我的zn += 7的問題是:爲什麼在倒數第二行zn += 7改變tn陣列?

+0

幾個編碼點。 'tn'等的初始'零'定義被後面的賦值覆蓋。你不需要它們。在'g'中,'()'不添加任何內容。使用'return x',或按照答案'return x.copy()'中的建議。 – hpaulj

回答

7

當您定義g()時,您會使其參數不變。因此,當你說zn = g(tn)時,你實際上是在說zn = tn。因此,zn現在只是tn的另一個名稱。 +=運營商不是相當於的確切副本x = x +。它通常做同樣的事情,但在後臺調用名爲__iadd__的方法。由於zntn現在是同一個對象,因此您正在調用tn__iadd__方法。因此,tn被修改。要改變這種情況,當你第一次定義它時,你可以說zn = tn.copy();或者當您嘗試添加7時,您可以說zn = zn + 7