列表的追加操作

时间:2015-09-08 12:56:40

标签: python list append

class Solution:
    """
    @param nums: A list of Integers.
    @return: A list of permutations.
    """
    def permute(self, nums):
        # write your code here
        result = []
        if nums is None:
            return result
        self.permution(nums, 0, result)
        return result

    def permution(self, array, k, result):
        if k == len(array):
            print array
            result.append(array)
        else:
            for i in xrange(k, len(array)):
                array[i], array[k] = array[k], array[i]
                self.permution(array, k+1, result)
                array[i], array[k] = array[k], array[i]

if __name__=="__main__":
    print Solution().permute([1, 2, 3])

这是关于排列的代码。当我输出答案时,我发现了问题。

如果我使用print array,则输出为

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]

这是对的。但是当我使用result.append(array)时,输出是

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

我不明白为什么不一样。

1 个答案:

答案 0 :(得分:0)

这是一个简单的call_by_reference问题。您通过引用传递array而不是每次递归中的值。由于array是通过引用传递的,因此任何递归步骤中的更改都适用于result中的所有子数组,因为每个子数组都是同一数组的引用。要获得正确的结果,请执行以下操作:

替换:

self.permution(array, k+1, result)

使用:

self.permution(array[:], k+1, result)

有关该主题的更多详细信息,请参阅passing arguments