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