Python列表循环赋值疑似Bug:原列表意外被覆盖问题排查
问题分析:修改列表b为何会影响原列表a?
你遇到的是Python中可变对象的引用赋值典型坑点,咱们一步步拆解问题:
实际输出结果
先看代码运行后的真实输出:
a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] b: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
看起来a好像没被修改?这只是巧合——5次外层循环(每次把前2个元素移到末尾)刚好把10个元素全移动了一遍,列表绕回了初始状态。如果把外层循环次数改成3次,你会看到a变成[6, 7, 8, 9, 0, 1, 2, 3, 4, 5],就能明显看到a被修改的痕迹。
问题核心原因
关键问题出在这行代码:b = a
在Python中,列表属于可变对象,当你把可变对象赋值给另一个变量时,并没有创建新的列表副本,只是让b和a指向了内存中同一个列表对象。简单说,a和b是同一个列表的两个“外号”,指向的是同一个东西。
所以你对b执行的append(b[0])和pop(0)操作,本质上都是在修改那个唯一的列表对象,a作为这个对象的另一个引用,自然会同步看到这些修改。
解决方法
如果想让b成为a的独立副本,修改b不影响a,可以用这几种常用方式:
- 切片操作(最简洁的列表复制方式):
b = a[:] - list()构造函数:
b = list(a) - copy模块浅拷贝(适合更复杂的嵌套场景):
import copy b = copy.copy(a)
把b = a替换成上面任意一种写法后,再运行代码,原列表a会始终保持初始状态,b每次都是a的独立副本,修改b再也不会影响到a了。
内容的提问来源于stack exchange,提问作者Mr. Python
相关产品推荐
相关产品推荐

