Python循环中append列表出错:为何结果为[[], []]而非预期格式?
列表append操作错误排查
问题描述
我尝试使用append函数操作列表,代码如下:
list_all = [] list_gen = ['male', 'DEAN', 'SAM', 'JASON'] list_all.append(list_gen) list_gen = ['female', 'LARA', 'SUSI'] list_all.append(list_gen) a_list = [] b_list = [] for x in list_all: a_list.append(x[:1]) a_list.append(x[1:]) b_list.append(a_list) a_list.clear() print(b_list)
运行结果为:[[], []]
我的预期结果是:[[['male'], ['DEAN', 'SAM', 'JASON']], [['female'], ['LARA', 'SUSI']]]
错误原因
核心问题是列表是可变对象:你将a_list添加到b_list时,b_list中存储的并不是a_list当前内容的副本,而是指向a_list内存地址的引用。后续调用a_list.clear()会直接清空这个内存地址里的列表内容,所以最终b_list里的两个元素都会指向被清空后的空列表。
解决方法
方法一:每次循环新建a_list
不再复用同一个a_list,而是在每次循环中创建新的列表对象:
list_all = [] list_gen = ['male', 'DEAN', 'SAM', 'JASON'] list_all.append(list_gen) list_gen = ['female', 'LARA', 'SUSI'] list_all.append(list_gen) b_list = [] for x in list_all: a_list = [] # 每次循环初始化新列表 a_list.append(x[:1]) a_list.append(x[1:]) b_list.append(a_list) print(b_list)
方法二:添加a_list的副本到b_list
如果要复用a_list,可以在添加时传入它的副本,而不是原列表的引用:
list_all = [] list_gen = ['male', 'DEAN', 'SAM', 'JASON'] list_all.append(list_gen) list_gen = ['female', 'LARA', 'SUSI'] list_all.append(list_gen) a_list = [] b_list = [] for x in list_all: a_list.append(x[:1]) a_list.append(x[1:]) b_list.append(a_list.copy()) # 添加列表副本 a_list.clear() print(b_list)
内容的提问来源于stack exchange,提问作者EnerGy liTe
相关产品推荐
相关产品推荐

