我正在學習用 Python 撰寫遞回函式,發現一個串列可以有不同的行為,具體取決于我選擇使用res.append(new_loc)還是res [new_loc].
例如,
def solver(counter,res):
print("Entering the solver:",res)
if len(res) >= 4:return
counter = 1
res.append(counter)
solver(counter,res)
print("inner solver returned:",res)
counter = 1
res.append('haha%i'% counter)
solver(0,[])
這給了我輸出
Entering the solver: []
Entering the solver: [1]
Entering the solver: [1, 2]
Entering the solver: [1, 2, 3]
Entering the solver: [1, 2, 3, 4]
inner solver returned: [1, 2, 3, 4]
inner solver returned: [1, 2, 3, 4, 'haha5']
inner solver returned: [1, 2, 3, 4, 'haha5', 'haha4']
inner solver returned: [1, 2, 3, 4, 'haha5', 'haha4', 'haha3']
該串列res就像一個記錄器,并保存所有值。
但是,如果我solver稍微改變一下功能
def solver(counter,res):
print("Just entering the solver:",res)
if len(res) >= 4:return
counter = 1
solver(counter,res [counter])
print("inner solver returned:",res)
counter = 1
res.append('haha%i'% counter)
solver(0,[])
輸出變為
Just entering the solver: []
Just entering the solver: [1]
Just entering the solver: [1, 2]
Just entering the solver: [1, 2, 3]
Just entering the solver: [1, 2, 3, 4]
inner solver returned: [1, 2, 3]
inner solver returned: [1, 2]
inner solver returned: [1]
inner solver returned: []
在這種情況下,為什么res.append('haha%i'% counter)不作業?
uj5u.com熱心網友回復:
res [counter]創建一個新串列,您沒有將其分配給res,只是將其作為方法引數傳遞。即使res是可變的,此操作也不會改變原始物件。
每個遞回方法呼叫都有一個單獨的串列,這就是“進入”列印陳述句很好,但“內部”陳述句沒有正確值的原因。修改沒有傳遞回鏈。
另一方面,使用append()orextend()將改變原始物件。正如有關Mutable Sequence 操作的檔案中所見,res = [counter]將等效于extend(),因為它將新串列重新分配給res。
一種可視化的簡單方法是在呼叫后測驗原始串列的值:
inp_list = []
solver(0, inp_list)
print(inp_list)
輸出 1 將是[1, 2, 3, 4, 'haha5', 'haha4', 'haha3', 'haha2']因為您的所有方法都修改了同一個串列,即您最初傳遞的串列。這將作業append(),extend()和 =。
輸出 2 將是['haha2'],因為只有您的初始solver()呼叫會修改此串列。遞回呼叫根本不會影響它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405880.html
標籤:
