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

Python循环赋值覆盖问题:b1-b5输出均等于b5的排查

问题:线性方程组格式化输出时b1-b4全部等于b5

我逐行输入矩阵数据到a1、a2、a3、a4、a5数组,要在屏幕展示线性方程组。为优化格式,对每个数组元素处理:若元素≥0则添加+号,处理后的字符串存入b1、b2、b3、b4、b5数组。但输出时发现b1、b2、b3、b4的值全部等于b5,无法定位问题。相关代码如下:

from colorama import init
from colorama import Fore

init()

a1 = a2 = a3 = a4 = a5 = b1 = b2 = b3 = b4 = b5 = P = Q = X = [0, 0, 0, 0, 0, 0]

det = det_check = 0
matrix = [[0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0],
          [0, 0, 0, 0, 0]]


def input_cof():
    global a1, a2, a3, a4, a5

    print(Fore.LIGHTGREEN_EX)
    print("Введите элементы матрицы 'A' (ВВОДИТЬ ЧИСЛА ЧЕРЕЗ ПРОБЕЛ ПОСТРОЧНО!):")
    print(Fore.LIGHTWHITE_EX)

    print("Первая строка:")
    a1 = [float(i) for i in input().split()]

    print("Вторая строка:")
    a2 = [float(i) for i in input().split()]

    print("Третья строка:")
    a3 = [float(i) for i in input().split()]

    print("Четвёртая строка:")
    a4 = [float(i) for i in input().split()]

    print("Пятая строка:")
    a5 = [float(i) for i in input().split()]

    check_cof()


def check_cof():
    global a1, a2, a3, a4, a5, b1, b2, b3, b4, b5

    zero = float(0)

    k = 0
    while k < 5:
        if a1[k] > zero:
            b1[k] = "+" + str(a1[k])
        elif a1[k] == zero:
            b1[k] = "+" + str(a1[k])
        else:
            b1[k] = str(a1[k])
        k += 1
    print(b1)
    k = 0
    while k < 5:
        if a2[k] > zero:
            b2[k] = "+" + str(a2[k])
        elif a2[k] == zero:
            b2[k] = "+" + str(a2[k])
        else:
            b2[k] = str(a2[k])
        k += 1
    print(b2)
    k = 0
    while k < 5:
        if a3[k] > zero:
            b3[k] = "+" + str(a3[k])
        elif a3[k] == zero:
            b3[k] = "+" + str(a3[k])
        else:
            b3[k] = str(a3[k])
        k += 1
    print(b3)
    k = 0
    while k < 5:
        if a4[k] > zero:
            b4[k] = "+" + str(a4[k])
        elif a4[k] == zero:
            b4[k] = "+" + str(a4[k])
        else:
            b4[k] = str(a4[k])
        k += 1
    print(b4)
    k = 0
    while k < 5:
        if a5[k] > zero:
            b5[k] = "+" + str(a5[k])
        elif a5[k] == zero:
            b5[k] = "+" + str(a5[k])
        else:
            b5[k] = str(a5[k])
        k += 1
    print(b5)
    output_cof()


def output_cof():
    cycle = str(0)
    while cycle != "Y":
        global a1, a2, a3, a4, a5, b1, b2, b3, b4, b5

        print(Fore.LIGHTGREEN_EX)

        #Here's the error, all the values of b are the same...

        print(f'''Введённая СЛАУ:
        
        |{a1[0]}x₁{b1[1]}x₂{b1[2]}x₃{b1[3]}x₄{b1[4]}x₅ = {a1[5]}
        |{a2[0]}x₁{b2[1]}x₂{b2[2]}x₃{b2[3]}x₄{b2[4]}x₅ = {a2[5]}
        |{a3[0]}x₁{b3[1]}x₂{b3[2]}x₃{b3[3]}x₄{b3[4]}x₅ = {a3[5]}
        |{a4[0]}x₁{b4[1]}x₂{b4[2]}x₃{b4[3]}x₄{b4[4]}x₅ = {a4[5]}
        |{a5[0]}x₁{b5[1]}x₂{b5[2]}x₃{b5[3]}x₄{b5[4]}x₅ = {a5[5]}''')
错误原因

问题出在初始化语句:

a1 = a2 = a3 = a4 = a5 = b1 = b2 = b3 = b4 = b5 = P = Q = X = [0, 0, 0, 0, 0, 0]

Python中这种链式赋值会让所有变量指向同一个列表对象。也就是说,b1到b5本质是同一个列表的不同别名,最后对b5的修改会覆盖之前所有b数组的内容,导致所有b数组看起来和b5完全一致。

修复方案

1. 修正初始化方式

给每个数组单独创建独立的列表对象,避免共享引用:

# 单独初始化每个列表
a1 = [0, 0, 0, 0, 0, 0]
a2 = [0, 0, 0, 0, 0, 0]
a3 = [0, 0, 0, 0, 0, 0]
a4 = [0, 0, 0, 0, 0, 0]
a5 = [0, 0, 0, 0, 0, 0]
b1 = [0, 0, 0, 0, 0, 0]
b2 = [0, 0, 0, 0, 0, 0]
b3 = [0, 0, 0, 0, 0, 0]
b4 = [0, 0, 0, 0, 0, 0]
b5 = [0, 0, 0, 0, 0, 0]
P = [0, 0, 0, 0, 0, 0]
Q = [0, 0, 0, 0, 0, 0]
X = [0, 0, 0, 0, 0, 0]

或者用更简洁的批量生成方式:

# 批量生成多个独立列表
a1, a2, a3, a4, a5 = [[0]*6 for _ in range(5)]
b1, b2, b3, b4, b5 = [[0]*6 for _ in range(5)]
P, Q, X = [[0]*6 for _ in range(3)]

2. 优化重复代码(可选)

check_cof函数中有大量重复的循环逻辑,可以用数组配对+循环批量处理,减少冗余:

def check_cof():
    global a1, a2, a3, a4, a5, b1, b2, b3, b4, b5
    zero = 0.0
    # 将a数组和对应的b数组配对,循环处理
    array_pairs = [(a1, b1), (a2, b2), (a3, b3), (a4, b4), (a5, b5)]
    for a_arr, b_arr in array_pairs:
        for k in range(5):
            if a_arr[k] >= zero:
                b_arr[k] = f"+{a_arr[k]}"
            else:
                b_arr[k] = str(a_arr[k])
        print(b_arr)
    output_cof()

内容的提问来源于stack exchange,提问作者LeE_RoY.TheSaint

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:40:31