考慮下面的代碼段,其產生陣列的大小爲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重新綁定。 –