You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:29:56