Python中的内存和函数变量

时间:2016-02-18 05:13:51

标签: python function memory

当调用如下所示的groupby_even_odd函数时,Python如何管理分配给函数变量的内存? 返回值后,函数变量even_nums/odd_nums使用的内存会发生什么变化? 我的搜索包含的产量信息对我来说有点太技术化了。如果有人能指出我一些好的信息或分享一些指示我会非常感激 提前致谢。

def groupby_even_odd(numbers):
    even_nums = [number for number in numbers if not number % 2]
    odd_nums = [number for number in numbers if number % 2]
    return {'even': even_nums, 'odd': odd_nums}

1 个答案:

答案 0 :(得分:1)

CPython的内存管理基于引用计数。基本上,它会跟踪代码中有多少“事物”引用特定对象。当引用计数降为0时,python将回收对象的内存以供重用或可能完全取消分配。举个例子:

  • 在您的函数中,当您第一次创建even_nums时,该列表的引用计数为1(even_nums引用该列表)。
  • 然后当您点击return语句时,您创建了一个字典,该字典还包含对even_nums的引用,因此引用计数变为2。
  • 返回后,本地堆栈帧被销毁/回收,因此本地堆栈帧保存到列表(even_nums)的引用消失,这使得引用计数回落到1。

此时,我们不能说太多其他内容。如果调用者随后保留对返回值的引用,则引用计数将保持为1.如果调用者未保留对返回值的引用,则引用计数将降至0并且垃圾收集器将回收该内存。

循环引用也可能出现一些细微之处(列表指的是引用回列表的对象)。在这种情况下,引用计数无法自行降至0。幸运的是,python检测到这些情况并能够释放这些对象以防止内存泄漏。