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

为何向嵌套列表中的列表执行append后原列表也被修改?

问题核心:Python的可变对象与引用机制

先看你贴的代码:

list = [1,2,3,4]
for x in [list]: # 这里是把原列表放进了一个新列表里
    x.append(2)

print(x)
print(list)

你疑惑的点在于:明明没直接改list,它却跟着变了——本质是Python里的可变对象(比如列表、字典),变量和容器存储的都是对象的引用,而不是对象本身。

具体拆解代码逻辑:

  • 第一行list = [1,2,3,4]:在内存里创建了一个列表对象[1,2,3,4],变量list存的是这个对象的内存地址(引用)。
  • 第二行for x in [list]:这里创建了一个新列表,里面的元素不是原列表的复制版,而是直接把list的引用放进去了。也就是说,新列表里的元素和list指向的是同一个内存里的列表对象。
  • 循环里x.append(2):x拿到的是那个引用,调用append是直接操作它指向的原列表对象——相当于你用两把钥匙开同一扇门,用x这把钥匙开门加了个元素,用list这把钥匙开门自然也能看到变化。
  • 最后打印时,x和list都指向同一个修改后的列表,所以输出完全一致。

补充个对比,要是换成不可变对象(比如字符串),结果就不一样:

s = "hello"
for x in [s]:
    x = x + " world"
print(x)  # 输出 hello world
print(s)  # 输出 hello

因为字符串是不可变的,x = x + " world"不是修改原对象,而是生成了一个新的字符串对象,x转而指向新对象,但s还是指向原来的字符串,所以原变量不会变。

内容的提问来源于stack exchange,提问作者ceramics.2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:45