numpy.array 作為參數傳入函數中時,是作為引用進去的,函數內部對這個數組的修改會直接修改原始數據。在函數中需要暫時修改數據,不對原始數據造成影響的話,需要用 np.copy() 先拷貝一份,在拷貝上修改。
但是在函數內部對其進行 del 時,只是刪除了引用的局部變量,不會影響原數據。del 只是刪除對一個數據的引用的變量,當這個數據沒有變量在指向它時,他就會被回收,在函數中傳入時相當於增加了一個對數據的引用的臨時變量,不手動刪除也會在函數結束時被刪除。
如果直接返回參數,那么兩個是一樣的(x is a == True)
ps:對一些忘記給變量名的值,del 沒法刪,要手動調用 gc.collect() 回收。
實驗代碼如下:
x = np.arange(5) # x = array([0,1,2,3,4]) def change1(x): x[0]=-1 return x # 直接修改了x,同時也返回經過修改的值 # a = change1(x) # x = array([-1,1,2,3,4]) # a = array([-1,1,2,3,4]) # x is a == True def change2(x): a=np.copy(x) a[0]=-1 return a # 沒有修改x,返回經過修改的值 # a = change2(x) # x = array([0,1,2,3,4]) # a = array([-1,1,2,3,4]) # x is a == False def change3(x): x=np.copy(x) x[0]=-1 return x # x 不會被替代,函數里的x和輸入的參數x已經是兩個不同的東西了 # a = change3(x) # x = array([0,1,2,3,4]) # a = array([-1,1,2,3,4]) # x is a == False def change4(x): e=np.copy(x) del e return x # 返回了原來的 x # a = change4(x) # x = array([0,1,2,3,4]) # a = array([0,1,2,3,4]) # x is a == True def change5(x): e=np.copy(x) del x return e # x 不會被刪除釋放 # a = change5(x) # x = array([0,1,2,3,4]) # a = array([0,1,2,3,4]) # x is a == False