Python 打印到stdout会给出正确的列表,但追加到列表不会给出正确的列表
我正在leetcode上处理此问题: 给定不同整数的集合,返回所有可能的置换 如果我反复打印结果,我会得到正确的值。一旦我将其添加到列表中,结果就不正确。发生了什么事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:
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,既然你提到了它。