在python中使用list的append函数

时间:2014-05-29 17:46:17

标签: python list

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 个答案:

答案 0 :(得分: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)]