【发布时间】:2017-01-14 04:41:43
【问题描述】:
>>p = 5
>>id(p)
140101523888800
>>p = 5.56
>>id(p)
140100617985840
我知道将新值分配给现有变量时,它指向内存中存储新值的新位置。但我的问题是,包含先前值5 的内存位置是否仍然存在?
如果是的话,会不会在重新分配几次后导致内存溢出?
【问题讨论】:
标签: python memory memory-management
>>p = 5
>>id(p)
140101523888800
>>p = 5.56
>>id(p)
140100617985840
我知道将新值分配给现有变量时,它指向内存中存储新值的新位置。但我的问题是,包含先前值5 的内存位置是否仍然存在?
如果是的话,会不会在重新分配几次后导致内存溢出?
【问题讨论】:
标签: python memory memory-management
如果不指定特定的 python 版本/实现,你真的不能问这样的问题。如果您在谈论参考实现(CPython),您可以查看此reference 或this one for python3.x。
具体来说:
理解 Python 堆的管理是由解释器本身执行的,用户无法控制它,这一点很重要
因此无法回答内存位置是否仍然有效。我们可以谈论的是对象是否会被垃圾收集器收集。由于 CPython 依赖于引用计数,因此当您为 p 分配不同的值时,原始值的引用计数会减少 1。如果该引用计数降至零,则垃圾收集器将收集该对象。这意味着内存位置可用于其他一些对象或可能python会将内存返回给操作系统。作为用户,您无法控制 Python 解释器将执行哪些操作(或何时执行)。
基本上,python 解释器会处理所有必要的细节,以防止内存泄漏/内存溢出等。作为一个 python 程序员,你不需要担心这些细节,就像你需要担心的一样如果您使用 C 等较低级别的语言进行编码,请了解它们。
【讨论】:
基本上,您需要了解变量是如何引用到值的。当您分配值时,它并不拥有该值。如果变量 p 引用 5,它只是表明它有 5。一旦你重新引用 5.56,你的元素 5 将消失,新元素将被引用。确保了解它是如何被引用的。
>>p = 5 #variable p is referencing to value 5
>>id(p)
140101523888800
>>p = 5.56 #same variable p is referencing to the new value 5.56
>>id(p)
140100617985840
【讨论】: