为何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
相关产品推荐
相关产品推荐

