变量的赋值

Assignment of a variable

我对 python 中的变量赋值问题感到困惑。我试着找pages on internet about this issue,还是没看懂

假设我为变量分配了某个值:

v = 2

Python 在某个内存位置保留了一个值为 2 的位置。我们现在知道如何通过给它分配一个变量名来访问那个特定的内存位置:v

如果那样,我们这样做:

v = v + 4

一个新的内存位置将用值 6 (2+4) 归档,所以现在要访问这个值,我们将变量 v 绑定到它。

这是正确的还是完全错误的?

内存位置的初始值2会怎样?它不再绑定到任何变量,所以不能再访问这个值?这是否意味着在接下来的几分钟内,这个内存位置将被垃圾收集器释放?

感谢您的回复。

编辑:

v = 2v = v + 2只是简单的例子。在我的例子中,我有一个非 python 本机对象,而不是 2 和 v+2,它的重量可以从几十兆字节到 400 兆字节不等。 我很抱歉没有在一开始就清除它。我不知道整数和其他类型的对象之间有区别。

就此而言,您是正确的。实际上,Python 构造整数对象 24。在第一个赋值中,解释器使 v 指向 2 对象。

在第二个作业中,我们构建了一个对象 6 并使 v 指向它,如您所料。

接下来会发生什么取决于实施。大多数将对象用于偶数原子值的解释器和编译器会将 2 对象识别为一个小整数,很可能会再次使用,并且维护成本非常低——所以它不会收集起来。一般情况下,代码中出现的字面量是不会被上交垃圾回收的。


感谢您更新问题。是的,您的没有引用的大对象现在可用于 GC。

小整数(-5 到 256)的例子不是最好的例子,因为它们以特殊的方式表示(例如参见 [​​=14=])。

你对事物的流动通常是正确的,所以如果你有类似的东西

v = f(v)

发生以下情况:

  • 评估 f(v)(模小整数或文字优化)
  • 后创建了一个新对象
  • 这个新对象绑定到变​​量v
  • 以前在 v 中的任何内容现在都无法访问,而且通常很快就会被垃圾回收