我在Python中编写一个简单的算法来打印给定元素列表的所有排列,但遇到了一个我无法调试的错误:
def perm(prefix, rest):
if len(rest) == 0:
print prefix
print len(rest)
for i in range(len(rest)):
#The next 3 prints are for debugging purposes only
print type(prefix)
print "prefix=", prefix
print "rest=", rest
newprefix = prefix.append( rest[i])
newrest = rest
newrest.pop(i)
perm(newprefix, newrest)
perm([], ['a','b','c'])
由于某些原因,我的变量'prefix'在我的for循环的第一次迭代后变为None类型。这是我得到的输出:
3
<type 'list'>
prefix= []
rest= ['a', 'b', 'c']
2
<type 'NoneType'>
prefix= None
rest= ['b', 'c']
Traceback (most recent call last):
File "self2.py", line 19, in <module>
perm([], ['a','b','c'])
File "self2.py", line 16, in perm
perm(newprefix, newrest)
File "self2.py", line 13, in perm
newprefix = prefix.append( rest[i])
AttributeError: 'NoneType' object has no attribute 'append'
答案 0 :(得分:4)
list.append
就地更改列表并返回None
。因此,此步骤newprefix
实际上是None
。
newprefix = prefix.append( rest[i])
答案 1 :(得分:4)
问题出在
行newprefix = prefix.append( rest[i])
perm(newprefix, newrest)
append
返回None
,然后您将None
传递给perm
方法的下一次调用,因为newprefix
已设置为None
}。
也许你想要
prefix.append(rest[i])
newprefix = prefix
但是,如果是这种情况,您可以将perm
来电更改为perm(prefix, newrest)
,而您根本不需要newprefix
。