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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:26:21