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
相关产品推荐
相关产品推荐

