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