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]:- 在内存中生成包含原列表元素和
[4]的新列表; list_1的指针从旧列表地址切换到新列表地址;list_2仍指向旧列表,因此内容不同。
- 在内存中生成包含原列表元素和
list_1 += [4]:- 直接在
list_1当前指向的内存地址里,对原列表进行原地扩展(底层调用列表的__iadd__方法,作用就是原地修改); list_1的指针没有变化,仍指向原内存地址;list_2和list_1指向同一地址,修改后内容同步。
- 直接在
简言之:+是生成新对象,+=是原地修改原对象,这就是两者输出差异的根源。
内容的提问来源于stack exchange,提问作者Solid
相关产品推荐
相关产品推荐

