我正在尝试在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'])
答案 0 :(得分:33)
要制作浅色副本,您可以对列表进行切片:
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'])
答案 1 :(得分:11)
import copy
a = [somestuff]
b = copy.copy(a) # Shallow copy here.
c = copy.deepcopy(a) # Deep copy here.