Python循环中list.append()与list.clear()的异常行为问询
问题原因及解决办法
行为解释
你遇到的问题核心在于Python中列表是可变对象:
- 你在循环外仅创建了一个smalllist列表对象,每次循环调用
smalllist.clear()只是清空该对象内的元素,并没有生成新的列表。 - 当执行
biglst.append(smalllist)时,你并没有把smalllist的当前内容复制进去,而是把这个列表对象的**引用(内存地址)**添加到了biglst中。 - 这意味着biglst里的10个元素,全都是指向同一个列表对象的"指针"。每次循环修改这个对象的内容(清空后添加新随机数),所有指向它的引用都会同步看到最新内容。所以循环结束后打印biglst,所有元素自然都是最后一次迭代时smalllist的内容。
解决办法
有两种简单的修复方式:
方式一:每次循环创建新列表
把smalllist的定义移到循环内部,每次迭代都生成一个全新的列表对象:
import random as r def try1(): biglst = [] for i in range(10): smalllist = [] # 每次循环创建新列表 smalllist.append(r.randint(1, 10)) print(smalllist) biglst.append(smalllist) print("_____________End of for loop__________") for i in biglst: print(i) try1()
方式二:添加列表的副本而非原引用
如果需要保留循环外的smalllist定义,可以在append时传入列表的副本,避免复用同一个对象的引用:
import random as r def try1(): biglst = [] smalllist = [] for i in range(10): smalllist.clear() smalllist.append(r.randint(1, 10)) print(smalllist) biglst.append(smalllist.copy()) # 添加副本 print("_____________End of for loop__________") for i in biglst: print(i) try1()
内容的提问来源于stack exchange,提问作者Tarun Baria
相关产品推荐
相关产品推荐

