Python for循环追加列表时所有子列表结果相同的问题
问题根因
Python里列表是可变对象,函数传参时传递的是列表的内存引用,不是列表的完整拷贝。
你的change_w函数全程在传入的原列表上做原地修改,最后返回的也是原列表的引用。三次循环调用时,你每次都把全局的o_list直接传进去,修改的始终是同一块内存里的同一个列表:
- 循环内
print(x)时,你看到的是当前轮次修改完的瞬时值,所以三次打印结果不一样 - 你append到
all_list里的三个值,本质都是同一个o_list的内存引用,没有生成新列表
等整个循环跑完,o_list停在最后一次修改的最终状态,此时再打印all_list,三个指向同一块内存的引用自然全部显示最后一次的修改结果,看起来三个子列表完全相同。
你可以在循环内加一行print(id(x))验证,三次输出的内存地址会完全一致。
修复方案
两种改法任选即可,核心逻辑都是保证每次生成独立的新列表对象,不共享同一块内存:
方案1:修改函数逻辑,内部操作副本不修改原入参
进入函数后先拷贝一份传入的列表,所有修改操作在副本上执行,最后返回新副本:
import random def change_w(w): # 生成入参列表的副本,和原列表隔离 current_w = w.copy() for idx in range(len(current_w)): current_w[idx] += random.randint(-5, 5) return current_w o_list = [100, 100, 100, 100] all_list = [] for i in range(3): x = change_w(o_list) print(x) all_list.append(x) print(all_list)
方案2:不修改原函数,传参时传入原列表的副本
如果你不想调整change_w的现有逻辑,每次调用函数时不要直接传原o_list,而是传它的拷贝即可:
import random def change_w(w): for item in range(len(w)): w[item] += random.randint(-5, 5) return w o_list = [100, 100, 100, 100] all_list = [] for i in range(3): # 每次传入原列表的拷贝,原列表不会被修改,每次调用都生成独立新列表 x = change_w(o_list.copy()) print(x) all_list.append(x) print(all_list)
提示:上面用的
.copy()是浅拷贝,如果你的列表里嵌套了其他可变对象(比如子列表、字典),需要导入copy模块用copy.deepcopy()做深拷贝才能实现完全隔离,当前场景列表元素都是整数,浅拷贝完全满足需求。
内容的提问来源于stack exchange,提问作者python_user
相关产品推荐
相关产品推荐

