【问题标题】:What happens to memory locations in Python when you overwrite a variable?当你覆盖一个变量时,Python 中的内存位置会发生什么?
【发布时间】:2014-04-13 16:40:54
【问题描述】:
In [1]: class T(object):
   ...:     pass
   ...:

In [2]: x = T()

In [3]: print(x)
<__main__.T object at 0x03328E10>

In [4]: x = T()

In [5]: print(x)
<__main__.T object at 0x03345090>

分配给第一个 T() 对象 (0x03328E10) 的内存位置何时释放?是在变量x 被覆盖时还是在运行垃圾收集器时或脚本结束时?

我假设它是垃圾收集器运行的时候,但我不知道如何测试这个假设。

【问题讨论】:

标签: python python-3.x


【解决方案1】:

Python 内存管理大部分是通过引用计数完成的,而不是垃圾收集。当引用计数变为零时,内存可用于重新分配。

只有当你有循环引用时,垃圾收集器才会发挥作用,这里不是这种情况。

【讨论】:

    【解决方案2】:

    首先,这取决于您使用的 Python 实现。参考实现 CPython 会进行引用计数,这意味着您的假设是正确的。您可以通过实现__del__ 方法来测试该假设。

    但是,避免这种做法是一种不好的做法。例如,PyPy、IronPython 和 Jython 会进行垃圾收集,因此无法保证您的假设。

    那么如何在 Python 中实现资源终结呢?请改用context managers。上下文管理器是RAII Python 提供的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2015-01-15
      • 2018-04-08
      • 2010-11-15
      • 2014-02-11
      相关资源
      最近更新 更多