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
python 中内存释放与函数传递numpy数组问题的更多相关文章
- 6.Python中内存是如何管理的?
Python中内存是如何管理的? Python memory is managed by Python private heap space. All Python objects and data ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- python中enumerate()函数用法
python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6] 请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...
- Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用
Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...
- Python中sort和sorted函数代码解析
Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...
- Python中进制转换函数的使用
Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制).bin()(十进制转换到 ...
- python中的内置函数(一), lambda, filter, map
https://www.processon.com/view/link/5c10da0ce4b099ae3e137bf6 1.内置函数 内置函数就是python中提供的,可以直接拿来用的函数,比如pr ...
- python中的内置函数(2)
一.lambda匿名函数定义:为了解决一些简单的需求而设计的一句话函数例子:计算n的n次方 def func(n):#正常的写法 return n**2 f=lambda n:n**2 这里的lamb ...
随机推荐
- 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
(本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个 ...
- what a fuck!这是什么鬼东西?
Topic Link http://ctf5.shiyanbar.com/DUTCTF/1.html 1) 打开链接发现一片看不懂的东西,还真是WTF? 2)分析发现是Jother编码 将其放到浏览器 ...
- leetcode — binary-tree-maximum-path-sum
/** * * Source : https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ * * * Given a binary ...
- LeetCode专题-Python实现之第28题: Implement strStr()
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- PE知识复习之PE的RVA与FOA的转换
PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...
- 【响应式编程的思维艺术】 (3)flatMap背后的代数理论Monad
目录 一. 划重点 二. flatMap功能解析 三. flatMap的推演 3.1 函数式编程基础知识回顾 3.2 从一个容器的例子开始 3.3 Monad登场 3.4 对比总结 3.5 一点疑问 ...
- MySql如何查询JSON字段值的指定key的数据
实例:SELECT param->'$.pay' as pay_type FROM game.roominfo; 其中:param是roominfo表的一个字段,当中存的是JSON字符串,pay ...
- 使用顶级 VSCode 扩展来加快开发 JavaScript
使用顶级 VSCode 扩展来加快开发 JavaScript 发表于 2018年08月24日 by 愚人码头 被浏览 3,942 次 分享到: 小编推荐:掘金是一个面向程序员的高质量技术社区,从 ...
- js之正则的坑
首先给一个神奇的图: 我的反应,精分吧!一会儿true一会儿false的... 后来发现,把g去掉后就正常了,那这是为什么呢??lastIndex惹得鬼! 正文: lastIndex 全局正则表达是, ...
- Web前端 HTML知识总结
HTML篇 一.HTML的概念 HTML:就是Hyper Text Markup Languaged的缩写,意思就是超文本标志语言 (超文本:功能比普通文本要强:标志语言:使用一组标签对内容进行描述的 ...