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

Python Unittest调用函数返回重复错误数组问题求助

问题根源分析

你遇到的重复元素问题,核心原因是全局变量spalte_ideal_sammlung的生命周期与测试执行逻辑不匹配:

  • 直接运行main.py时,你会调用main()函数,该函数会将全局变量初始化为空列表,之后调用least_square_berechnung()只会追加4个元素,结果正确。
  • 但单元测试中,你从未调用过main(),全局变量没有被初始化为空列表。更关键的是,全局变量的状态会在模块运行期间持续保留——如果least_square_berechnung()被调用多次(比如模块导入时意外执行过一次,或者测试框架重复执行测试逻辑),新的元素会不断追加到同一个列表中,最终出现重复的8项结果。

另外,使用全局变量存储计算结果本身就会导致代码耦合度高、可测试性差,这是引发此类问题的根本设计缺陷。

解决方案

方案1:改用实例变量替代全局变量(推荐)

将spalte_ideal_sammlung改为LeastSquare类的实例变量,每个实例拥有独立的列表,彻底避免状态残留:

class LeastSquare(Berechnung):  # Klasse LeastSquare erbt von Berechnung
    def __init__(self):
        super().__init__()
        self.spalte_ideal_sammlung = []  # 实例变量,每个实例独立初始化

    def least_square_berechnung(self):
        # 每次调用方法时可选择清空列表(如果需要每次计算都是全新结果)
        self.spalte_ideal_sammlung = []
        ls_ideal = []
        trainingsdaten = ["y1", "y2", "y3", "y4"]
        for columns_train in training.columns[1:]:
            mse = 9999
            for columns_ideal in ideal.columns[1:]:
                mse_zw = (mean_squared_error(training[columns_train], ideal[columns_ideal]))
                if mse_zw < mse:
                    mse = mse_zw
                    spalte_ideal = ideal[columns_ideal].name
            ls_ideal.append(mse * len(ideal))
            self.spalte_ideal_sammlung.append(spalte_ideal)
        # 省略打印代码
        return self.spalte_ideal_sammlung

修改后,单元测试每次创建LeastSquare实例时,都会得到一个全新的空列表,无论调用多少次方法,都不会出现元素累积的问题。

方案2:手动初始化全局变量(不推荐,仅临时修复)

如果必须保留全局变量,可在单元测试中手动初始化全局变量为空列表,确保每次测试的初始状态一致:

import unittest
import main

class MyTestCase(unittest.TestCase):
    def test_something(self):
        # 测试前手动重置全局变量
        main.spalte_ideal_sammlung = []
        instanz1 = main.LeastSquare()
        result = instanz1.least_square_berechnung()
        print(result)
        # 可添加断言验证结果长度
        self.assertEqual(len(result), 4)

if __name__ == '__main__':
    unittest.main()

或者在least_square_berechnung()方法开头主动清空全局变量:

class LeastSquare(Berechnung):
    def least_square_berechnung(self):
        global spalte_ideal_sammlung
        spalte_ideal_sammlung = []  # 每次调用方法时清空全局列表
        ls_ideal = []
        # 后续原有代码不变

额外建议

  • 避免使用全局变量存储临时计算结果,改用实例变量、局部变量或返回值传递,提升代码的可维护性和可测试性。
  • 在单元测试中添加断言(如验证结果长度、元素内容),而不只是打印输出,这样能自动检测结果是否符合预期。

内容的提问来源于stack exchange,提问作者Kinggpuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:31:09