我可以問一個關于 Python 遞回的問題嗎?我想檢查這背后的邏輯,為什么這能夠不斷更新結果?
問題:構建 DFS 遞回以追加滿足指定條件的所有子節點,例如,如果節點的結束指示符為 True,我們將將此節點添加到陣列中。此遞回將在另一個函式中使用。
- 我的代碼:
def dfs(self, level, ls):
# if we meet the end of a level, this level’s information will be added to the returned list
if level.end:
ls.append(level.info)
# go further to explore this level’s children, even an end is met.
for c in level.child:
ls = self.dfs(level.child[c], ls)
return ls
該DFS會由被稱為:
ls = self.dfs(self.curr, [])
level 是一個自定義的 Trie:
class Trie:
def __init__(self):
self.child = collections.defaultdict(Trie)
# self.child = {}
self.end = False
self.w = ''
self.f = 0
我不確定為什么這ls會在每次 for 回圈迭代中更新,然后傳遞到下一次迭代。我也感到驚訝的是,以下代碼也有效:
for c in level.child:
self.dfs(level.child[c], ls)
無需回傳ls. 我不確定為什么會這樣?
在此先感謝您的幫助。
最好的事物,
樸素的 Python 學習者
uj5u.com熱心網友回復:
當串列被傳遞到 時dfs,傳遞的不是 中的當前值list,而是指向list記憶體中的參考(指標)。只有一個list。這稱為通過參考傳遞。
類似地,當代碼分配dfsto的輸出時ls,這實際上是用指向list物件的指標替換指向物件的指標list,即它什么都不做。
Python FAQ 中甚至有一個與此相關的答案。在這個答案中有一些帶有示例的進一步閱讀。
如果您想讓您的代碼按照您的想法運行,您可以構建一個新的list而不是編輯單個list. 這樣做有一些原因,但正常情況下list它相當昂貴且價值不大。要查看它的實際效果,請將append呼叫更改為:
ls = ls [level.info]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356403.html
