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

Python 打印到stdout会给出正确的列表,但追加到列表不会给出正确的列表,python,permutation,Python,Permutation,我正在leetcode上处理此问题: 给定不同整数的集合,返回所有可能的置换 如果我反复打印结果,我会得到正确的值。一旦我将其添加到列表中,结果就不正确。发生了什么事 class Solution: def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ if len(nums) == 1:

我正在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]]

您不断向排列添加对同一列表的引用

当你打电话时:

置换

Python没有复制列表,而是添加了一个引用。你只有一张单子

您要做的是:

排列。附录p[:]


将获取副本。

当您从交换返回NUM时,您不是在复制,而是返回稍后将修改的相同列表。您可以在返回时复制,也可以在将列表附加到结果时复制。

这是许多代码中的常见错误。您在这里看到的bug是一种症状,即从swap返回的值与nums相同。这意味着您正在将NUM一次又一次地添加到排列列表中。如果你打印整个排列列表而不是只打印p,你会发现它们总是一样的


解决方案相当简单:在代码中的某个点上,可能是在swap中,或者需要创建nums列表的副本。

您有一个列表,其中充满了对同一个列表的引用,您不会在任何地方创建副本。就我个人而言,如果该方法返回副本,我会将其称为swapped,而不是swap,按照排序与排序之类的惯例,@jbch你说得很好。我考虑了一个修改列表的函数,并将其返回为代码气味。看,这很公平,我没有提到它,但我也会让一个就地函数返回None,既然你提到了它。