Python列表元素全部变为同一值的问题求助及代码分析
问题核心
Python里列表是可变对象,你每次往params里加的都是同一个列表p的引用。后面调用get_next时,修改的是这个列表本身,所以params里所有元素最终都指向最后修改完的那个列表,自然全是同一个值。
两种修复方案
方案一:添加列表副本到params
在params.append(p)的时候,存p的副本而不是原列表。用p[:]或者list(p)都能生成副本:
def get_next(next_params): for i in range(0, 1000000): for x in range(0, len(next_params)): if next_params[x] != 255: next_params[x] += 1 break else: next_params[x] = 0 return next_params def thread_execution(): params = [] p = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for i in range(0, 10): params.append(p[:]) # 这里存储列表副本 p = get_next(p) print(p) print(params) thread_execution()
方案二:让get_next返回新列表
修改get_next,不修改传入的列表,而是创建新列表修改后返回,这样每次p都会指向新的独立列表:
def get_next(next_params): # 先复制原列表,避免修改原对象 new_params = next_params.copy() for i in range(0, 1000000): for x in range(0, len(new_params)): if new_params[x] != 255: new_params[x] += 1 break else: new_params[x] = 0 return new_params def thread_execution(): params = [] p = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for i in range(0, 10): params.append(p) p = get_next(p) print(p) print(params) thread_execution()
效果说明
两种方法都能让params里的每个元素保持独立,和你每次打印的中间p值一致,不会全变成最后一个值。
内容的提问来源于stack exchange,提问作者Names Are Too Mainstream
相关产品推荐
相关产品推荐

