如何在Python中制作列表的浅表副本


问题内容

我正在尝试在Python中实现一种算法,以生成列表的所有排列。但是我在for循环中希望保持原先的前缀和rest列表不变,因此我试图使用newprefix和newrest制作这些列表的副本,但是在每次迭代打印变量rest时,我看到即使可变休息正在被修改!如何在Python中制作列表的浅表副本?还是我尝试的逻辑还有其他问题?

def perm(prefix, rest):
    if len(rest) == 0:
        print prefix 
    for i in range(len(rest)):
        #prints in the for loop are just for debugging
        print "rest:", rest
        print "i=", i
        newprefix = prefix
        newprefix.append(rest[i])
        newrest = rest
        newrest.pop(i)
        print "old pre : ", prefix
        print "newpre=", newprefix
        print "newrest=", newrest
        perm(newprefix, newrest)


perm([], ['a','b','c'])

问题答案:

要制作浅表副本,可以对列表进行切片:

newprefix = prefix[:]

或将其传递给list构造函数:

newprefix = list(prefix)

另外,我认为您可以稍微简化一下代码:

def perm(prefix, rest):
    print prefix, rest

    for i in range(len(rest)):
        perm(prefix + [rest[i]], rest[:i] + rest[i + 1:])

perm([], ['a','b','c'])