我正在嘗試獲取嵌套串列中所有專案的計數。當代碼遍歷所有專案時,計數器被設定為僅非嵌套串列專案。發生了什么以及如何更正此代碼?
def countarr(arr,count):
if len(arr) == 0:
return count
else:
if type(arr[0]) != list:
count = 1
print(arr[0],count)
else:
print ("inner")
countarr(arr[0],count)
return countarr(arr[1:],count)
count=0
arr=[1,2,[[4,5]],8,[7,4,5,6],12,34]
print("Answer: ",countarr(arr, count))
uj5u.com熱心網友回復:
count是一個型別的變數int。在 python 中將 as 引數傳遞int給函式時,只傳遞值,而不傳遞實際變數。因此,當遞回呼叫“修改count”時,它實際上修改了變數的副本,而不是原始變數。所以,原版沒有更新。
此外,當您進行遞回呼叫時:countarr(arr[0]),您沒有使用該呼叫的回傳值。您可以簡單地count =在遞回呼叫前面添加,以檢索遞回呼叫的回傳值:
def countarr0(arr,count):
if len(arr) == 0:
return count
else:
if not isinstance(arr[0], list):
count = 1
else:
count = countarr0(arr[0], count)
return countarr0(arr[1:], count)
arr=[1,2,[[4,5]],8,[7,4,5,6],12,34]
print("Answer: ",countarr0(arr, 0))
# Answer: 11
但是,將引數傳遞count給遞回呼叫并不是很有用。遞回呼叫不需要知道count. 遞回呼叫應該只計算嵌套子串列中有多少元素,我們將其回傳值添加到當前計數中:
def countarr1(arr):
if len(arr) == 0:
return 0
else:
count = 0
if isinstance(arr[0], list):
count = countarr1(arr[0])
else:
count = 1
count = countarr1(arr[1:])
return count
arr=[1,2,[[4,5]],8,[7,4,5,6],12,34]
print("Answer: ",countarr1(arr))
# Answer: 11
請注意,使用遞回來導航子串列是個好主意;但是在 python 中使用遞回來迭代串列是一個壞主意。在python中,遞回比for-loops慢得多;此外,當您撰寫 時arr[1:],會生成一個全新的陣列副本!這是非常低效的。相反,我們可以使用回圈來迭代串列:
def countarr2(arr):
count = 0
for x in arr:
if isinstance(x, list):
count = countarr2(x)
else:
count = 1
return count
arr=[1,2,[[4,5]],8,[7,4,5,6],12,34]
print("Answer: ",countarr2(arr))
# Answer: 11
uj5u.com熱心網友回復:
變數不會神奇地重置。它們僅設定為您給它的值。修改區域變數的值不會影響另一個函式中另一個變數的值,即使它具有相同的名稱。舉個例子:
def foo(count):
print(count)
count = 1
print(count)
def bar()
count = 0
print(count)
foo(count)
print(count)
bar()
遞回是一樣的。每個遞回函式呼叫都有自己的區域變數副本,每個副本foo()都有bar()一個名為 count 的變數,它們彼此獨立。
要修復遞回函式,只需count從每個可能的if...else分支回傳值。您已經在其中兩個分支中執行了此操作,但您只在另外兩個分支中列印該值并且不回傳它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/478707.html
