Python函数内创建的列表是否存栈内存?返回及numpy数组使用是否安全?
Python中函数内创建的对象内存与安全性问题
函数内创建的列表的内存存储与返回安全性
- Python的内存模型和C完全不同:所有Python对象(包括列表、numpy数组)都存储在堆内存中,函数栈里仅存放这些对象的引用(类似指针的概念)。
- 函数内创建的列表,只要还有活跃的引用指向它(比如返回给外部、添加到外部容器里),Python的垃圾回收机制就不会回收这个对象,所以返回或者传递这类列表是完全安全的,不存在C语言中栈内存回收导致的失效问题。
针对你的代码的安全性分析
你的函数代码:
def f(list_value: list): a = numpy.zeros(5) b = numpy.zeros(4) list_value.append(a) list_value.append(b)
调用代码:
list_value = [] f(list_value) a = list_value[0] b = list_value[1]
- 代码里的
a和b是numpy创建的数组对象,同样存储在堆内存中。函数f执行完毕后,虽然函数栈里的局部引用会被销毁,但你已经把这两个数组对象的引用添加到了外部的list_value列表里,而list_value在函数外是活跃的。 - 后续你通过
list_value[0]和list_value[1]获取到的引用赋值给变量a和b,这些新的引用会继续维持数组对象的存活状态,所以后续使用这两个变量是绝对安全的,不会出现C语言中栈内存释放导致的非法访问问题。
Python的垃圾回收机制基于引用计数(辅以分代回收),只要对象的引用计数大于0,就不会被回收,这从根本上避免了C语言中栈内存相关的安全问题。
内容的提问来源于stack exchange,提问作者fabianod
相关产品推荐
相关产品推荐

