在Python中插入2D列表时出现粘滞索引引用



当试图实现一个函数,该函数在给定整数列表的情况下生成所有排列时,我看到了插入没有按预期发生的行为。

我的代码:

def permute(nums):
perms = [[]]
for i in range(len(nums)):
new_perms = perms * (i + 1)
for j in range(len(new_perms)):
new_perms[j].insert(j % len(perms), nums[i])
perms = new_perms
return perms

当调用permute([1, 2, 3])时,我希望排列像一样增长

[[]]
[[1]]
[[2, 1], [1, 2]
[[3, 2, 1], [1, 3, 2], [2, 1, 3], [3, 1, 2], [2, 3, 1], [1, 2, 3]

然而,通过使用new_perms: [[1], [1]]的内部循环的第二次迭代,我预计它会增长到[[2, 1], [1, 2]],而不是[[2,1],[2,1]],然后是[[2,2,1],[2,2,1]]。在j循环的每次迭代中,在每次迭代中同时将数字插入列表的所有值的的当前j位置。这不是我想要做的,也不是我所期望的。

最终,代码输出:

[[3,3,3,3,2,2,1],[3,3,3,3,33,2,2,,1],[3,33,3,3,4,3,2,2,1][3,3,33,3,2,3,2,2,1,1],[33,3,3,,33,3,6,2,2,1]

要么这是一些微妙的参考行为(是的,学习一些新的东西!(要么我只是度过了一个非常愚蠢的一天;(感谢您的帮助。

请注意:我不是在寻求替代或最佳排列功能的帮助!我试图弄清楚为什么这个特定的代码会以一种意想不到的方式运行。非常感谢。

好的,在这里学到了一个好的。深度复制!

import copy
def permute(nums):
perms = [[]]
for i in range(len(nums)):
len_perms = len(perms)
old_perms = perms
perms = []
for _ in range(i+1):
perms += copy.deepcopy(old_perms)
for j in range(len(perms)):
perms[j].insert(j // len_perms, nums[i])
return perms

最新更新