为何两段Python列表赋值代码输出不同?预期结果不符
为什么两段列表赋值代码的输出结果不同?
示例1:每次循环创建新列表
输入代码
for i in range(5): lst = [0,0,0,0,0] lst[i] = 1 print(lst)
输出结果
1, 0, 0, 0, 0 0, 1, 0, 0, 0 0, 0, 1, 0, 0 0, 0, 0, 1, 0 0, 0, 0, 0, 1
示例2:循环中复用同一列表引用
输入代码
mainlst = [0,0,0,0,0] for i in range(5): templst = mainlst templst[i] = 1 print(templst)
输出结果
1, 0, 0, 0, 0 1, 1, 0, 0, 0 1, 1, 1, 0, 0 1, 1, 1, 1, 0 1, 1, 1, 1, 1
差异原因
核心问题在于Python里的列表是可变对象,直接赋值操作传递的是对象引用,不是内容复制:
- 示例1中,每次循环都会执行
lst = [0,0,0,0,0],这会在内存里新建一个独立的全0列表。修改这个新列表的第i位后打印,下一次循环又会生成全新的列表,所以每次输出都只有一个位置是1。 - 示例2中,
mainlst是在循环外创建的唯一列表。循环里的templst = mainlst并没有生成新列表,只是让templst和mainlst指向内存中同一个列表对象。所以每次修改templst[i],本质上是在修改那个唯一的mainlst。第一次循环改第0位为1,第二次改第1位为1(此时第0位已经是1),以此类推,最终所有位置都被改成1。
如果想让示例2和示例1输出一致,需要每次循环复制原列表的内容,而不是传递引用。可以把templst = mainlst改成templst = mainlst.copy()或者templst = list(mainlst),这样每次循环都会生成原列表的副本,修改副本不会影响原列表。
内容的提问来源于stack exchange,提问作者Siddharth Mody
相关产品推荐
相关产品推荐

