Python中与切片相关的代码中的逻辑错误
考虑以下生成数组[1,2,3,…,n]大小为k的所有子集的代码:Python中与切片相关的代码中的逻辑错误,python,algorithm,python-3.x,recursion,Python,Algorithm,Python 3.x,Recursion,考虑以下生成数组[1,2,3,…,n]大小为k的所有子集的代码: def combinations(n, k): result = [] directed_combinations(n, k, 1, [], result) return result def directed_combinations(n, k, offset, partial_combination, result): if len(partial_combination) == k:
def combinations(n, k):
result = []
directed_combinations(n, k, 1, [], result)
return result
def directed_combinations(n, k, offset, partial_combination, result):
if len(partial_combination) == k:
new_partial = [x for x in partial_combination]
result.append(new_partial)
return
num_remaining = k - len(partial_combination)
i = offset
# kind of checks if expected num remaining is no greater than actual num remaining
while i <= n and num_remaining <= n - i + 1:
partial_combination.append(i)
directed_combinations(n, k, i + 1, partial_combination, result)
del partial_combination[-1]
# partial_combination = partial_combination[:-1] <-- same funcationality as line above, but produces weird bug.
i += 1
print(combinations(n=4,k=2))
def组合(n,k):
结果=[]
有向_组合(n,k,1,[],结果)
返回结果
def定向_组合(n、k、偏移、部分_组合、结果):
如果len(部分_组合)=k:
new_partial=[x代表部分_组合中的x]
结果.追加(新的\u部分)
回来
剩余数量=k-len(部分组合)
i=偏移量
#检查预期剩余num是否不大于实际剩余num
虽然我一开始并没有注意到您的函数是递归的(应该更好地阅读您的标记)
你说得对,从功能上来说,这两个几乎是一样的。以下是完全相同的事情:
# del partial_combination[-1] # working (mutate)
# partial_combination = partial_combination[:-1] # different (rebind)
partial_combination[:] = partial_combination[:-1] # same (mutate)
上述每一项的结果都将是您最终得到一个包含相同元素的列表。但是当del
和部分组合[:]
改变原始列表时,中间的一个会将名称重新绑定到具有相同元素的新列表中。当您将这个新列表传递到下一个递归步骤时,它将在自己的副本上操作,而不是在前一个递归级别正在处理的单个列表上操作
为了证明这一点,您可以在上述每个选项之后调用print(id(partial_composition))
,查看id
在重新绑定情况下的变化,而在整个变异情况下保持不变。好的。这是有道理的。然而,一开始,我很困惑为什么最后一个选项改变了列表,而不是创建一个新的。我以前从来没有看过《切片》的作业。检查数据库为我澄清了这一点。@AzaTulepbergenov了解变异与重新绑定。