在 Python 中插入二维列表时的粘性索引引用

Sticky index reference while inserting into 2D list in Python

在尝试实现一个函数来生成给定整数列表的所有排列时,我看到了这种插入未按预期发生的行为。

我的代码:

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 循环的每次迭代中,数字在每次迭代中同时插入到列表的 all 值的当前 j 位置。这不是我想要做的或期望的。

最终,代码输出:

[[3,3,3,3,3,3,2,2,1],[3,3,3,3,3,3,2,2,1],[3,3 ,3,3,3,3,2,2,1],[3,3,3,3,3,3,2,2,1],[3,3,3,3,3,3,2 ,2,1],[3,3,3,3,3,3,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