Python中while循环内列表为何重置,外部列表修改可保留?
嘿,这个问题其实戳中了Python里可变对象和变量赋值的核心点,我来给你掰扯清楚~
先把你的示例代码格式化一下(顺便加了个终止条件避免无限循环):
x = [1,1,1] count = 0 while count < 3: a = [1,1,1] b = x a.append(1) b.append(2) print(a) count += 1
核心原因:赋值时机 + 列表的引用特性
这里要抓住两个关键知识点:
- 变量赋值的执行时机:循环外的代码只跑一次,循环内的代码每轮迭代都会重新执行
- 列表是可变对象:Python里给变量赋值列表时,存的是列表在内存中的引用(不是整个列表的拷贝)
1. 循环外的x:只初始化一次,所有迭代共享同一个列表
x = [1,1,1]是写在while循环外面的,所以只会在程序启动时创建一次这个列表,变量x保存的是这个列表的内存地址。
每次循环里的b = x,其实是把x的引用复制给b——也就是说,b和x指向的是内存里同一个列表。所以你调用b.append(2)时,本质是在修改那个一开始就创建的列表,下一轮循环时x依然指向这个已经被修改过的列表,所以更改会一直保留。
2. 循环内的a:每轮迭代都生成全新的列表
a = [1,1,1]是写在循环里面的,所以每轮循环都会重新执行这句话:创建一个全新的[1,1,1]列表,再把这个新列表的引用赋值给a。不管上一轮循环里a被追加了什么,下一轮都会被新的初始列表覆盖,所以每次打印a都是[1,1,1,1],之前的修改留不住。
直观验证:打印x的变化就能看明白
我们稍微修改代码,把x也打印出来:
x = [1,1,1] count = 0 while count < 3: a = [1,1,1] b = x a.append(1) b.append(2) print(f"第{count+1}次循环:") print(f"a = {a}") print(f"x = {x}\n") count +=1
执行结果会是:
第1次循环: a = [1,1,1,1] x = [1,1,1,2] 第2次循环: a = [1,1,1,1] x = [1,1,1,2,2] 第3次循环: a = [1,1,1,1] x = [1,1,1,2,2,2]
你看,x每次都在之前的基础上追加2,而a每次都是新列表追加1后的结果,对比一下就一目了然了。
一句话总结
- 想让修改在循环中保留?把变量的初始化放到循环外面,只创建一次对象,每轮都操作同一个。
- 想每次循环都重置为初始状态?把初始化放到循环里面,每轮都生成新对象。
内容的提问来源于stack exchange,提问作者immeeh
相关产品推荐
相关产品推荐

