考虑下面的代码段,其产生阵列的大小为k的所有子集[1,2,3,...,N]:逻辑错误
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))
例如,combinations(n=4,k=2)
将生成[1,2,3,4]长度为2的所有子集。 代码中有两行产生一个删除最后一个元素的列表。我尝试用del
完成它,并通过切掉最后一个元素(即[-1]
)创建一个全新的列表。与del
版本产生正确的结果。但是,与[-1]
版本不。没有运行时错误;只是一个逻辑错误(即错误的结果)。
我怀疑这与创建一个新的清单时做切片与保持相同的列表del
有关。我似乎无法理解为什么这是一个问题。
好的。这说得通。然而,起初,我很困惑为什么最后一个选项突变了列表而不是创建一个新列表。我以前从来没有见过分配给切片。检查[docs(3.1.3节)](https://docs.python.org/3/tutorial/introduction.html)为我阐明了它。 –
@AzaTulepbergenov [这里是一个额外的来源](http://nedbatchelder.com/text/names.html)了解变异VS重新绑定。 –