You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表拼接(+)、append与+=的内存行为差异解惑

从内存层面理解Python列表操作的差异原因

我们直接分析三组代码的内存行为差异:

第一段代码

list_1 = [1, 2, 3]
list_2 = list_1
list_1 = list_1 + [4]
print(list_1)  # 输出: [1,2,3,4]
print(list_2)  # 输出: [1,2,3]

list_1 + [4]会在内存中创建一个全新的列表对象,随后list_1变量被重新赋值,指向这个新对象。而list_2的指针始终指向最初的旧列表,因此两者输出不同。

第二段代码

list_1 = [1, 2, 3]
list_2 = list_1
list_1.append(4)
print(list_1)  # 输出: [1,2,3,4]
print(list_2)  # 输出: [1,2,3,4]

append()是列表的原地修改方法,直接在list_1和list_2共同指向的内存地址中修改列表内容,没有创建新对象,所以两个变量指向的仍是同一个列表,输出一致。

第三段代码

list_1 = [1,2,3]
list_2 = list_1 
list_1 += [4]
print(list_1)  # 输出: [1,2,3,4]
print(list_2)  # 输出: [1,2,3,4]

这里的核心是:+=对于列表来说,不是创建新对象,而是原地修改原列表,和append()的内存逻辑一致,和+的行为完全不同。

内存层面的本质差异

  • list_1 = list_1 + [4]:

    1. 在内存中生成包含原列表元素和[4]的新列表;
    2. list_1的指针从旧列表地址切换到新列表地址;
    3. list_2仍指向旧列表,因此内容不同。
  • list_1 += [4]:

    1. 直接在list_1当前指向的内存地址里,对原列表进行原地扩展(底层调用列表的__iadd__方法,作用就是原地修改);
    2. list_1的指针没有变化,仍指向原内存地址;
    3. list_2和list_1指向同一地址,修改后内容同步。

简言之:+是生成新对象,+=是原地修改原对象,这就是两者输出差异的根源。

内容的提问来源于stack exchange,提问作者Solid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:40:31