首页 > 解决方案 > 返回的列表与函数内部的不同

问题描述

这是我的代码:

def solve(lists,sums,num_list_,num,a):
    if len(num_list_)==num:
        if add(lists,num_list_)==sums:
            print(num_list_)
            return a+[num_list_]
        return a
    num_list=copy.deepcopy(num_list_)
    for x in range(10):
        num_list[num]=x
        a=solve(lists,sums,num_list,num+1,a)
    return a

def add(lists,unkown_num_list):
    answer=0
    for x in lists:
        st=''
        for y in x:
            if isinstance(y,int):
                y=str(unkown_num_list[y])
            st+=y
        st=int(st)
        answer+=st
    return answer

unkown_num_list=[]
difference=[]
a=solve([[0], [1, 0], [2, 1, 0], [3, 2, 1, 0]],2000,[0, 0, 0, 0],0,[])

它打印:

[0, 0, 0, 2]
[0, 0, 5, 1]
[5, 6, 4, 1]
[5, 6, 9, 0]

但是对于 variable a,它是这样的:

[[0, 0, 0, 9], [0, 0, 5, 9], [5, 6, 4, 9], [5, 6, 9, 9]]

为什么这两个不同?

是因为我使用了递归吗?但其他时候,他们没有这种错误。

我正在使用 python3.6.1 和 macOS High Sierra。

我是Python初学者,如有错误请指出。

标签: pythonalgorithmrecursion

解决方案


尽管您的solve函数中有一个 deepcopy,但在循环中,您在将相同的列表添加到结果后for仍然会对其进行变异。所以在循环有不止一次迭代的情况下,你会得到意想不到的结果。 num_listfor

一种解决方案是在循环移动 deepcopy :for

def solve(lists,sums,num_list_,num,a):
    if len(num_list_)==num:
        if add(lists,num_list_)==sums:
            print(num_list_)
            return a+[num_list_]
        return a
    for x in range(10):
        num_list=copy.deepcopy(num_list_) # <----------
        num_list[num]=x
        a=solve(lists,sums,num_list,num+1,a)
    return a

推荐阅读