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

