我想了解Python的内存管理是如何工作的。如果我有一个可变的变量,比如说一个list。
x = ['x1', 'x2']
print(id(x))
那么我将得到一个特定的内存地址。如果我现在修改x说 x.append('x3')
由于列表是可突变的数据类型,所以内存地址和之前一样。但是,如果我用 x = x + ['x3']
而我打印地址时却得到了不同的地址。为什么会这样?我的意思是... x
变量的名字还是一样的,我所做的只是修改它的内容。为什么Python会在这种情况下改变变量的地址?
的时候。
x = x + ['x3']
你就会创建一个 新的 list
分配给 x
. 以前的名单是以 "我的名字 "命名的。x
丢失,并进行垃圾回收(除非它存储在其他地方)。
创建一个新的元素,即使是以相同的名称存储,也会产生一个新的标识符。
另外请注意,如果你想在元素中附加 x3
(或另一个列表),因为复制原始列表来创建另一个列表,效率非常低。在你的情况下。x.append('x3')
是最快的方法,而 extend()
或 x += ['x3','x4','x5']
是最快的方法来追加(和突变)一个现有的多元素的列表。
(也注意到 +=
列表会发生变化,但当使用在不可变类型上时,如 tuple
但它仍然会产生另一个 tuple
)
变量在Python中是内存引用。当你说 x = x + ['x3']
它合并 x
和 ['x3']
并建立一个新的名单。从现在开始。x
是指向新建立的对象。这就是为什么你会得到一个不同的id。同时 ['x1', 'x2']
对象被删除,因为没有任何东西指向该对象,因为 x
是指向新的对象。