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

时间:2017-01-24 02:31:04

标签: python

我正在尝试为给定的集生成所有排列。在我的代码的每次回调中,当我使用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]

1 个答案:

答案 0 :(得分:1)

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

$

它会生成一个不断增长的列表:

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]

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

使用您的功能,将In [130]: alist[0].append(10) In [131]: alist Out[131]: [[0, 1, 2, 10], [0, 1, 2, 10], [0, 1, 2, 10]] 保存到nums[:]

res