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