Python变量在第一次迭代后丢失类型信息

时间:2013-04-29 01:52:22

标签: python python-2.7

我在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'

2 个答案:

答案 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

相关问题