为什么我的代码要在python中改变列表的内容?

为什么我的代码要在python中改变列表的内容?,python,Python,我试图生成给定集合的所有置换。在代码的每次回调中,当我使用append函数时,数组的内容会由于某种原因而改变。有人能给我指出正确的方向吗 class Solution(object): def permute(self, nums): res = [] self.generate_permutations(nums, res, 0, len(nums)-1) return res def generate_permutations

我试图生成给定集合的所有置换。在代码的每次回调中,当我使用append函数时,数组的内容会由于某种原因而改变。有人能给我指出正确的方向吗

class Solution(object):
    def permute(self, nums):
        res = []
        self.generate_permutations(nums, res, 0, len(nums)-1)
        return res

    def generate_permutations(self, nums, res, l, r):
        if l == r:
            res.append(nums)

        for i in range(l, r+1):
            nums[i], nums[l] = nums[l], nums[i]
            print('res', res)
            self.generate_permutations(nums, res, l+1, r)
            nums[l], nums[i] = nums[i], nums[l]

也许这个简化的生成器会让问题更清楚:

def gen(num):
    for i in range(3):
        num.append(i)
        yield num
它生成了一个不断增长的列表:

In [119]: g=gen([])
In [121]: next(g)
Out[121]: [0]
In [122]: next(g)
Out[122]: [0, 1]
In [123]: next(g)
Out[123]: [0, 1, 2]
但是如果我把结果收集到一个列表中,我会得到重复

In [125]: [i for i in gen([])]
Out[125]: [[0, 1, 2], [0, 1, 2], [0, 1, 2]]
相反,我需要收集副本

In [126]: [i[:] for i in gen([])]
Out[126]: [[0], [0, 1], [0, 1, 2]]
如果我查看每个元素的
id
,重复可能会更明显

In [129]: [id(i) for i in alist]
Out[129]: [2881121580, 2881121580, 2881121580]
或者如果我修改了列表中的一个元素(并最终修改了所有元素)

=================

使用您的功能,将
nums[:]
保存到
res

def generate_permutations(nums, res, l, r):
        if l == r:
            res.append(nums[:])        # <=== change
        for i in range(l, r+1):
            nums[i], nums[l] = nums[l], nums[i]
            generate_permutations(nums, res, l+1, r)
            nums[l], nums[i] = nums[i], nums[l]
In [158]: res=[];nums=[1,2,3]
In [159]: generate_permutations(nums, res,0,2)
In [160]: res
Out[160]: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
def生成排列(nums、res、l、r):
如果l==r:

res.append(nums[:])#顺便说一句,
return res.append
将返回
None
,您永远不会捕获递归返回值,但是
itertools
是您的朋友,您应该学习通过引用传递排列列表的方法。@cricket\u 007不知道我为什么在那里有return res.append。但我不使用itertools,因为这是用于算法研究的。它正确地生成排列,但是有一个python抓到了改变值的方法显示某些东西可以是“正确的”,但也可以是“改变值的”?为什么每次都反对创建一个副本?您想在列表中引用n个相同的排列,还是n个不同的排列?
def generate_permutations(nums, res, l, r):
        if l == r:
            res.append(nums[:])        # <=== change
        for i in range(l, r+1):
            nums[i], nums[l] = nums[l], nums[i]
            generate_permutations(nums, res, l+1, r)
            nums[l], nums[i] = nums[i], nums[l]
In [158]: res=[];nums=[1,2,3]
In [159]: generate_permutations(nums, res,0,2)
In [160]: res
Out[160]: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]