【问题标题】:Mutable variables and memory management in PythonPython中的可变变量和内存管理
【发布时间】:2020-05-10 11:35:22
【问题描述】:

我正在尝试了解 Python 内存管理的工作原理。如果我有一个可变变量,请说一个列表:

x = ['x1', 'x2']
print(id(x))

然后我会得到一个特定的内存地址。 如果我现在修改 x 说x.append('x3'),内存地址和以前一样,因为列表是可变数据类型。但是,如果我将 x 更改为 x = x + ['x3'] 并打印地址,我会得到一个不同的地址。为什么会这样?我的意思是,x 变量仍然具有相同的名称,我所做的只是修改它的内容。为什么 Python 在这种情况下会更改变量的地址?

【问题讨论】:

  • 因为它创建了一个新变量,它分配给名称x。你没有“只是修改它的内容”。修改内容做x += ['x3']

标签: python cpython


【解决方案1】:

做的时候:

x = x + ['x3']

您正在创建一个 list,它被分配给x。以前以 x 为名的列表丢失并被垃圾回收(除非它存储在其他地方)。

创建一个新元素,即使以相同的名称存储,也会产生一个新的标识符。

还请注意,如果您要附加 x3(或另一个列表),由于复制原始列表来创建另一个列表,效率非常低。在您的情况下,x.append('x3') 是最快的方式,extend()x += ['x3','x4','x5'] 是一次追加(和改变)具有多个元素的现有列表的最快方式。

(另请注意,+= 会改变列表,但当用于 tuple 等不可变类型时,它仍会创建另一个 tuple

【讨论】:

    【解决方案2】:

    变量是 Python 中的内存引用。当您说x = x + ['x3'] 时,它会合并x['x3'] 并构建一个新列表。从现在开始,x 将指向新构建的对象。这就是为什么你得到一个不同的id。同时['x1', 'x2'] 对象被删除,因为没有任何东西指向该对象,因为x 正在指向新对象。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2020-08-19
      • 2012-12-10
      • 1970-01-01
      • 2015-12-16
      • 2019-06-23
      • 2013-07-19
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多