此函式反轉串列中找到的所有專案。甚至內部串列也會顛倒過來。我的問題是我不明白 reversed_list 在遞回后如何保持 7 和 6。因為一旦呼叫 deep_reverse,reversed_list 就會變為空,然后它會保持內部串列的反轉,即 [5, 4, 3]。我沒有意識到的是,一旦附加了這個專案, reversed_list 就會變成 [7, 6, [5, 4, 3]]
def deep_reverse(arr):
# Terminaiton / Base condition
if len(arr) < 1:
return arr
reversed_items = [] # final list to be returned
for item in arr[::-1]:
# If this item is a list itself, invoke deep_reverse to reverse the items recursively.
if type(item) is list:
item = deep_reverse(item)
# append the item to the final list
reversed_items.append(item)
print(reversed_items)
return reversed_items ```
deep_reverse([1, 2, [3, 4, 5], 6, 7])
#printing the reversed_list
[7]
[7, 6]
[5]
[5, 4]
[5, 4, 3]
[7, 6, [5, 4, 3]]
[7, 6, [5, 4, 3], 2]
[7, 6, [5, 4, 3], 2, 1]
uj5u.com熱心網友回復:
不止一個reversed_list
你說:
一旦呼叫 deep_reverse,reversed_list 就會變為空
但不止一個reversed_list。每個呼叫都會創建一個新的list(并且恰好將其系結到同名的區域變數),但原始呼叫的reversed_list繼續存在,獨立于每個遞回呼叫的呼叫。這就是程式呼叫堆疊的要點:函式的每次呼叫都有自己的空間,有自己的區域變數,與所有其他呼叫(包括對同一函式的呼叫)分開。
每個新呼叫 都會deep_reverse在現有呼叫框架之上放置另一個呼叫框架,并帶有自己的reversed_list. 在它完成填充它之后,它回傳它,并且呼叫者(可能是deep_reverse它自己,給定遞回)可以用它做它喜歡的事情。在您的遞回呼叫的情況下,這意味著 rebinding item,它現在系結到list之前存盤在遞回呼叫中的reversed_list,然后可以附加到外部呼叫自己的reversed_list。
uj5u.com熱心網友回復:
解釋 IMO 的最簡單方法是print在函式中添加更多 s,以便可視化呼叫堆疊:
def deep_reverse(arr, level=0):
if len(arr) < 1:
return arr
reversed_items = [] # final list to be returned
print(level * " ", f"deep_reverse({arr}) -> ...")
for item in arr[::-1]:
# If this item is a list itself, invoke deep_reverse to reverse the items recursively.
if type(item) is list:
item = deep_reverse(item, level 1)
# append the item to the final list
reversed_items.append(item)
print(level * " ", reversed_items)
print(level * " ", f"... -> {reversed_items}")
return reversed_items
deep_reverse([1, 2, [3, 4, 5], 6, 7])
印刷:
deep_reverse([1, 2, [3, 4, 5], 6, 7]) -> ...
[7]
[7, 6]
deep_reverse([3, 4, 5]) -> ...
[5]
[5, 4]
[5, 4, 3]
... -> [5, 4, 3]
[7, 6, [5, 4, 3]]
[7, 6, [5, 4, 3], 2]
[7, 6, [5, 4, 3], 2, 1]
... -> [7, 6, [5, 4, 3], 2, 1]
[3, 4, 5]->是對[5, 4, 3]的單獨呼叫deep_reverse,它有自己的arrand reversed_items,現在你可以更容易地看到它,因為它有一個額外的縮進級別。
完成后,其結果將附加到外部呼叫的reversed_items,并且外部呼叫繼續使用arr[::-1].
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493074.html
