Python中与切片相关的代码中的逻辑错误

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:

考虑以下生成数组[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:
        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了解变异与重新绑定。