为什么append和concat会给我不同的结果?

2024-05-15 00:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以生成字符串的所有排列。它能很好地打印出所有可能的排列。但是现在我想要一个所有这些排列的列表。你知道吗

我尝试创建全局列表,并尝试将其作为参数传递,但在附加排列后,主列表中以前的所有列表都会更改为最后附加的列表。请解释一下这种行为

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]]

更新:
事实证明,这毕竟是一个很深的复制问题。我刚让一个临时变量存储了一个的深度副本,并将该临时变量附加到列表中。一切都解决了。你知道吗


Tags: 函数字符串列表outputifdef全局upper
2条回答

更改此行-每次追加列表的新实例

perm.append(list(a))

另一种获得排列的方法:

import itertools
def permutationNum(a):
for x in itertools.permutations(a):
    perm.append(list(x))

listy = [1,2,3]
perm = []
permutationNum(listy)
print(perm)

或者

import itertools

def permutationNum(a):
    return [list(x) for x in itertools.permutations(a)]
listy = [1,2,3]
print(permutationNum(listy))

在python中,某些数据类型作为参数传递到函数中时被复制,而其他数据类型则被引用。你知道吗

如果复制了参数,则在函数中对其所做的任何更改都不会影响传入的原始变量。你知道吗

如果参数被引用,函数中对它的任何更改都将影响原始的。你知道吗

复制字符串、int、float,同时引用对象和列表。将一个变量分配给另一个变量时,也会复制此行为:

a = 5
b = a
b = 6
print(a)
>>> 5

a = [5]
b = a
b.append(6)
print(a)
>>> [5, 6]

如果您想复制一个列表,而不仅仅是引用它,有多种方法可以实现这一点:

复制模块

import copy

a = [5]
b = copy.copy(a)
b.append(6)
print(a)
>>> [5]

切片

a = [5]
b = a[:]
b.append(6)
print(a)
>>> [5]

.copy()

a = [5]
b = a.copy()
b.append(6)
print(a)
>>> [5]

list()

a = [5]
b = list(a)
b.append(6)
print(a)
>>> [5]

因此,在您的情况下,您可以将以下行从:

permutationNum(a,lower+1,upper, perm)

permutationNum(a[:],lower+1,upper, perm)

相关问题 更多 >

    热门问题