Python 中的可变变量和内存管理

Mutable variables and memory management in Python

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

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

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

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

做的时候:

x = x + ['x3']

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

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

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

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