Python:测试函数改变值

时间:2015-02-20 09:45:20

标签: python list python-3.x unit-testing

我有清单:

DATA = [[5, 3, 0, 0, 7, 0, 0, 0, 0],
        [6, 0, 0, 1, 9, 5, 0, 0, 0],
        [0, 9, 8, 0, 0, 0, 0, 6, 0],
        [8, 0, 0, 0, 6, 0, 0, 0, 3],
        [4, 0, 0, 8, 0, 3, 0, 0, 1],
        [7, 0, 0, 0, 2, 0, 0, 0, 6],
        [0, 6, 0, 0, 0, 0, 2, 8, 0],
        [0, 0, 0, 4, 1, 9, 0, 0, 5],
        [0, 0, 0, 0, 8, 0, 0, 7, 9]]

在test_function中,我更改了此列表的1个数字:

def test_check_value(self):
        DATA[1][3] = 7...

(我用其他数字在多个函数中执行此操作)

最后我的整个名单都发生了变化。我能做些什么,以便函数只测试它(使用更改的值)并且不更改主列表的值?

3 个答案:

答案 0 :(得分:2)

在每次测试开始时使用copy.deepcopy

>>> import copy
>>> l1 = [[1, 2], [3, 4]]
>>> l2 = copy.deepcopy(l1)
>>> l2[0][0] = 9
>>> l2
[[9, 2], [3, 4]]
>>> l1
[[1, 2], [3, 4]]

请注意,它可以很好地工作,因为您将整数保留在嵌套列表中。如果它是一些可修改的数据结构,deepcopy将创建新实例。

答案 1 :(得分:1)

您可以在本地复制列表,为此,您可以使用copy.deepcopy功能。

import copy

def test_check_value(self):
    local_list = copy.deepcopy(DATA)
    local_list[1] = 0

我觉得有趣的是,使用内置的list()函数进行复制不适用于嵌套列表,因此在这种情况下必须使用copy.deepcopy
感谢@Bartosz Marcinkowski指出这一点。

有关列表副本的详细信息,请参阅http://stackoverflow.com./a/2612815/2549230

答案 2 :(得分:0)

您似乎已将列表定义为全局 .thus,为了解决这种情况,您需要将列表副本传递给您的函数,您可以使用[a[:] for a in DATA]来复制嵌套列表或使用copy.deepcopy()

my_list=[a[:] for a in DATA]
def test_check_value(self,my_list):