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

KT1*_*100 18 python python-2.7

我试图在Python中实现一个算法来生成列表的所有排列.但我在我的for循环中我希望保持原始前缀和休息列表完整,因此我试图使用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'])
Run Code Online (Sandbox Code Playgroud)

Ble*_*der 34

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

newprefix = prefix[:]
Run Code Online (Sandbox Code Playgroud)

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

newprefix = list(prefix)
Run Code Online (Sandbox Code Playgroud)

另外,我认为你可以稍微简化你的代码:

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'])
Run Code Online (Sandbox Code Playgroud)

  • 只是想知道 - 切片操作不是非声明性的吗?是不是最好清楚地宣布你在做什么?`copied_list = original_list [:]`没有声明副本正在发生,而`copied_list = copy.copy(original_list)`是高度声明的. (2认同)

Bla*_*ble 12

import copy

a = [somestuff]
b = copy.copy(a) # Shallow copy here.
c = copy.deepcopy(a) # Deep copy here.
Run Code Online (Sandbox Code Playgroud)

复制模块值得了解. https://docs.python.org/3/library/copy.html

(Python 2)http://docs.python.org/2/library/copy.html