zoukankan      html  css  js  c++  java
  • 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
    ---------------- 坚持每天学习一点点
  • 相关阅读:
    MySQL-多条件拼接语句
    MongoDB-C#驱动基本操作
    MongoDB-C#驱动帮助
    MongoDB-权限配置
    MongoDB-安装
    C#_实用
    提高C#代码质量-规范
    C#_Express-ickd接口
    Eclipse背景颜色修改
    Java中可变长参数的方法
  • 原文地址:https://www.cnblogs.com/tccbj/p/10787473.html
Copyright © 2011-2022 走看看