关于函数传入参数的问题

时间:2022-02-25 14:41:29

这个问题很心痛,想了好久了吧!

在做leetcode中的一题时,出现了一个问题。我非常自信的认为,我的算法流程是没有问题的。但是,中间出现的错误却让我不知所措,甚至让我烦心的要死(就是不知道问题出现在哪里)。

久久思寻不得结果,却在上厕所时灵光一现,TMD原来错误出现在这里。

leetcode中的原题是:

给定一组不同的整数 nums,返回所有可能的子集(幂集)。

注意事项:该解决方案集不能包含重复的子集。

例如,如果 nums = [1,2,3],结果为以下答案:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

这个问题是被归为回溯算法之中的。

由于之前做了一题回溯算法,题目是:给出 n 代表生成括号的对数,请你写出一个能够生成所有可能括号组合的函数。

我按照这个题目的解法做了这一题,就是按顺序生成所有可能的结果,把正确的结果加入到返回值之中,错误的就进行到下一个判断。

于是,有了下面的过程。

res=[]
nums=[1,2,3,4]
def fun(i,tmp):
    if i==len(nums):
        print(tmp)
        res.append(tmp)
        return
    fun(i+1,tmp)#当前索引的元素并不加入其中
    fun(i+1,tmp.append(nums[i]))#当前索引的元素加入其中
fun(0,[])
print(res)
print(len(res))

这其中有个错误很微妙,是很难看出来,甚至看不出来的。

你看到这,首先应该做的是停止往下看,看看我的代码是不是错误的,有错误的话错误出现在哪里。

。。。。。。。。。。。

自己琢磨了吗?琢磨了再往下看

运行中出现的错误是, 

File "E:/Python/subSet.py", line 9, in fun
    fun(i+1,tmp.append(nums[i]))
AttributeError: 'NoneType' object has no attribute 'append'

仙人板板的,我在tmp(一个数组)上调用了append方法,结果出现了错误?????

我的tmp什么时候变成了"NoneType",不是List类型的吗?

我用了debug模式调试(之前我都不会调试程序,这一次才正式的学会调试,,,,尴尬),突然就变成了"NoneType",真的是让我毫无防备。F7一进入函数,里面就变成了NoneType。草,为什么?

认识到这个错误是在我上厕所的时候(上厕所虽说是为了排泄,有的时候却有奇效)。TMD,第10行传入的参数不是添加了nums[i]之后的tmp,而是tmp.append(nums[i])的返回值,这个调用结果是None。

我记起了,之前有一次,参数中需要一个有序的数组,我就把nums.sort()传入其中。当时的这个错误也是把我搞了几天,都不知道问题出现在哪里。

没想到这次还是犯了同样的错误,希望以后警醒吧!