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

为何Python中追加列表后修改会影响原列表,追加字符串则不会?

为什么追加列表和字符串到列表后,修改原变量的结果不一样?

这事儿本质上就是Python里可变对象和不可变对象的区别在搞鬼,咱们结合你的例子慢慢说清楚:

先看列表追加的情况

你这段代码:

a=['toy','banana','gold']
b=[1,2,3]
a.append(b)
print(a)
b.append(5)
print(a)

输出:

['toy', 'banana', 'gold', [1, 2, 3]]
['toy', 'banana', 'gold', [1, 2, 3, 5]]

原因很简单:列表是可变对象。当你执行a.append(b)时,Python并没有把b里的元素复制一份放进a,而是把b这个列表对象的引用(可以理解为指向这个对象的“地址”)存进了a。也就是说,a的最后一个元素和变量b其实指向的是同一个列表对象。所以当你给b追加5的时候,你是在修改这个共享的列表对象,a里的那个元素自然也会同步变化——毕竟它们本来就是同一个东西。

再看字符串追加的情况

再看你这段字符串的代码:

a=['ram','john','sita']
b='laxman'
a.append(b)
print(a)
b='ravan'
print(a)

输出:

['ram', 'john', 'sita', 'laxman']
['ram', 'john', 'sita', 'laxman']

这里的核心是:字符串在Python里是不可变对象。什么叫不可变?就是一旦创建出来,你没法直接修改它的内容。当你执行b='laxman'时,变量b指向了一个值为'laxman'的字符串对象;把b追加到a后,a的最后一个元素保存的是这个'laxman'对象的引用。

而当你执行b='ravan'时,你并没有修改原来的'laxman'对象(你也改不了),而是让变量b重新指向了一个全新的'ravan'字符串对象。原来的'laxman'对象还安安稳稳地待在a里,所以a的内容自然不会变。

一句话总结

  • 可变对象(列表、字典等):支持原地修改,容器存储的是对象引用,修改原变量会影响容器内的内容。
  • 不可变对象(字符串、整数、元组等):无法原地修改,重新赋值变量只是指向新对象,原对象不受影响,容器内容也不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:17:42