Python中列表append函数的用法

1 投票
1 回答
1970 浏览
提问于 2025-04-18 07:58
class Solution:    
    # @param num, a list of integer
    # @return a list of lists of integers
        def permute(self, num):
            self.res = [];
            self.dfs(num, 0)
            return self.res

        def dfs(self, num, level):
            if level == len(num):
                self.res.append(num)
                print(num)
                return
            for i in range(level, len(num)):
                num[i], num[level] = num[level], num[i]
                self.dfs(num, level+1)
                num[i], num[level] = num[level], num[i]

上面的代码是用来生成一组数字的所有排列组合的。比如说,

如果数字是 num = [1, 3],那么结果会是:

[1, 3], [3, 1]

但是,上面的代码有一个我不太明白的错误,就是 self.res.append(num) 这一行。

如果我把它改成 self.res.append(num[:]),那么代码就能正常工作了。有人能解释一下为什么吗?

使用 self.res.append(num) 的时候,结果是:

[1, 3], [1, 3]

而使用 self.res.append(num[:]) 的时候,结果是:

[1, 3], [3, 1]

1 个回答

4

在Python中,list里的元素其实是指向其他对象的引用。当你用self.res.append(num)来添加元素时,这个列表的长度会增加1,最后一个元素会指向num所指向的对象。

在第一个情况下,有两个引用指向同一个list对象。因为self.res[0]self.res[1]都指向同一个对象,所以通过其中一个进行的任何修改,另一个也能看到。

在第二个情况下,使用num[:],这个[:]操作符会创建一个新的列表,这个新列表是原始列表的一个副本。


如果你想生成给定元素集合的所有排列,可以使用itertools.permutations这个工具:

>>> from itertools import permutations
>>> print(list(permutations([1, 3])))
[(1, 3), (3, 1)]

撰写回答