打印到stdout会给出正确的列表,但是追加到列表不会

时间:2018-06-22 21:45:50

标签: python permutation

我正在处理有关leetcode的问题:

  

给出一组不同的整数,返回所有可能的排列。

如果我反复打印结果,我会得到正确的值。一旦将其添加到列表中,结果将不正确。发生什么事了?

class Solution:
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if len(nums) == 1:
            return nums 

        permutations = list()
        import math
        max_swaps = math.factorial(len(nums))
        pair = [0,1]
        for i in range(max_swaps):
            if pair[1] == len(nums):
                pair[0] = 0
                pair[1] = 1
            p = self.swap(nums, pair[0], pair[1])
            print("Adding %s to the list" % p)
            permutations.append(p)
            pair[0] += 1
            pair[1] += 1
        return permutations

    def swap(self, nums, index1, index2):
        tmp = nums[index2]
        nums[index2] = nums[index1]
        nums[index1] = tmp
        return nums

我应该得到:

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

但是我得到了:

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

3 个答案:

答案 0 :(得分:3)

您一直将对同一列表的引用添加到permutations

致电时:

permutations.append(p)

Python不会复制列表,而是添加一个引用。您只有一个列表。

您想要做的是:

permutations.append(p[:])

将复制一份。

答案 1 :(得分:2)

当您从nums返回swap时,您不是在制作副本,而是在返回相同的列表,以后将对其进行修改。您可以在返回时或在列表append上复制结果时进行复制。

答案 2 :(得分:1)

这是很多代码中的常见错误。您在此处看到的错误是从swap返回的值与nums相同的症状。这意味着您要一遍又一遍地将nums附加到排列列表中。如果要打印整个permutations列表而不是仅打印p,您会发现它们始终相同。

解决方案非常简单:在代码中的某个点(可能是交换位置或某些位置),您需要复制nums列表。