python 中內存釋放與函數傳遞numpy數組問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM