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
)
我正在尝试了解 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
)