Python for循环append列表后结果异常,元素为何被移除?求助
问题分析与解决
你的问题核心是Python中可变对象的引用机制:列表是可变对象,a = bag并没有创建新的列表,只是把bag的引用赋值给了a。所以你每次向list_bag中添加的都是同一个bag对象的引用,后续执行bag.pop()修改原列表时,所有已经添加到list_bag里的元素都会跟着变化。循环结束后bag回到初始状态,最终list_bag里的所有元素自然都是['B', 'D']。
解决方案
方法1:添加列表副本而非引用
每次向list_bag中添加时,创建bag的副本(而不是直接添加原列表),这样后续修改原bag不会影响已添加的元素。可以用bag.copy()或者list(bag)来生成副本:
list_bag = [] bag = ['B', 'D'] rf = ['C', 'A', 'G', 'E'] for i in range(len(rf)): bag.extend(rf[i]) list_bag.append(bag.copy()) # 添加副本而非原列表引用 bag.pop() print(list_bag)
方法2:直接生成新列表(更简洁)
不需要修改原bag,直接通过列表拼接生成新的列表并添加,省去extend和pop的操作:
list_bag = [] bag = ['B', 'D'] rf = ['C', 'A', 'G', 'E'] for item in rf: list_bag.append(bag + [item]) # 直接拼接生成新列表 print(list_bag)
运行上述代码后,输出会是:[['B', 'D', 'C'], ['B', 'D', 'A'], ['B', 'D', 'G'], ['B', 'D', 'E']]
(注:你给出的预期输出里元素顺序和rf的元素不匹配,推测是笔误,上述代码的输出符合rf的元素顺序)
内容的提问来源于stack exchange,提问作者phuc
相关产品推荐
相关产品推荐

