我有一个函数,可以生成字符串的所有排列。它能很好地打印出所有可能的排列。但是现在我想要一个所有这些排列的列表。你知道吗
我尝试创建全局列表,并尝试将其作为参数传递,但在附加排列后,主列表中以前的所有列表都会更改为最后附加的列表。请解释一下这种行为
def permutationNum(a,lower,upper,perm):
if(lower==upper):
print(a)
print(perm)
perm.append(a)
# perm = perm.append(a)
else:
for i in range(lower,upper+1):
a[lower],a[i] = a[i],a[lower]
permutationNum(a,lower+1,upper, perm)
a[lower],a[i] = a[i],a[lower]
listy = [1,2,3]
perm = []
permutationNum(listy, 0, len(listy)-1, perm)
print(perm)
Output : [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
Expected Output : [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
更新:
事实证明,这毕竟是一个很深的复制问题。我刚让一个临时变量存储了一个的深度副本,并将该临时变量附加到列表中。一切都解决了。你知道吗
更改此行-每次追加列表的新实例
另一种获得排列的方法:
或者
在python中,某些数据类型作为参数传递到函数中时被复制,而其他数据类型则被引用。你知道吗
如果复制了参数,则在函数中对其所做的任何更改都不会影响传入的原始变量。你知道吗
如果参数被引用,函数中对它的任何更改都将影响原始的。你知道吗
复制字符串、int、float,同时引用对象和列表。将一个变量分配给另一个变量时,也会复制此行为:
如果您想复制一个列表,而不仅仅是引用它,有多种方法可以实现这一点:
复制模块
切片
.copy()
list()
因此,在您的情况下,您可以将以下行从:
permutationNum(a,lower+1,upper, perm)
到permutationNum(a[:],lower+1,upper, perm)
相关问题 更多 >
编程相关推荐