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

为何Python循环列表的三段代码执行结果不同?求解析

三段Python代码执行结果差异原因解析

代码1及问题原因

a = [1,2,3,4] 
c = [1,2,3,4] 
for i in a: 
    b = c 
    b.remove(i) 
    print(b) 

输出:[2, 3, 4] [3, 4] [4] []

Python里列表是可变对象,b = c并不是复制新列表,而是让b和c指向内存中同一个列表对象。每次循环调用b.remove(i)时,实际修改的就是c指向的那个列表。第一次循环删掉1,列表变成[2,3,4];第二次删掉2,变成[3,4];第三次删掉3,变成[4];第四次删掉4,列表为空,所以输出是逐步缩短的结果。


代码2及问题原因

a = [1,2,3,4] 
for i in a: 
    b = a 
    b.remove(i) 
    print(b) 

输出:[2, 3, 4] [2, 4]

这里b = a同样是引用赋值,修改b就是修改原列表a。更关键的是循环直接遍历a本身:

  • 第一次循环,i取1,删掉后a变成[2,3,4],此时循环的迭代器已经走到原列表的第二个位置(对应原元素2,现在a的第一个元素是2)。
  • 第二次循环,迭代器取下一个元素(当前a的索引1位置,即3),删掉3后a变成[2,4],此时原列表的4个元素已经遍历了2个,迭代器没有后续元素,循环直接结束,所以只输出两个结果。

代码3及符合预期的原因

a = [1,2,3,4] 
for i in a: 
    b = [1,2,3,4] 
    b.remove(i) 
    print(b) 

输出:[2, 3, 4] [1, 3, 4] [1, 2, 4] [1, 2, 3]

这段代码每次循环都会**新建一个独立的列表[1,2,3,4]**赋值给b,每次操作的都是全新的列表,彼此之间没有关联。删掉当前循环的i后,不会影响其他循环的列表,因此每次都能得到正确的、去掉单个元素的新列表,完全符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:52:20