在 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
在尝试实现一个函数来生成给定整数列表的所有排列时,我看到了这种插入未按预期发生的行为。
我的代码:
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