这个问题很心痛,想了好久了吧!
在做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()传入其中。当时的这个错误也是把我搞了几天,都不知道问题出现在哪里。
没想到这次还是犯了同样的错误,希望以后警醒吧!