[英]python: recurcive list processing changes original list
我正在嘗試做的是遞歸處理列表。 我是python的新手,所以當所有代碼都被編寫並發送執行時,我遇到了一個奇怪的問題:在調用遞歸函數后,列表返回了更改。 為了測試這個,我寫道:
def recur(n):
n.append(len(n))
print '>',n
if n[-1]<5: recur(n)
print '<',n
並稱為功能:
recur([])
結果如下:
> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
我期望看到的是
> [0]
> [0, 1]
> [0, 1, 2]
> [0, 1, 2, 3]
> [0, 1, 2, 3, 4]
> [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4, 5]
< [0, 1, 2, 3, 4]
< [0, 1, 2, 3]
< [0, 1, 2]
< [0, 1]
< [0]
,因為它是簡單的整數變量:
def recur(n):
n=n+1
print '>',n
if n<5: recur(n)
print '<',n
recur(0)
> 1
> 2
> 3
> 4
> 5
< 5
< 4
< 3
< 2
< 1
我怎樣才能解決這個問題以及我理解錯誤的原因?
函數的所有遞歸調用都在同一個列表中運行。 你需要復制一份:
def recur(n):
n.append(len(n))
print '>',n
if n[-1]<5: recur(n[:]) # <<<< Note the [:]
print '<',n
在如何通過引用傳遞變量的答案中有一些很好的解釋?
正如其他答案所示,您正在改變列表。 您可以制作列表的副本和/或使用不可變的數據結構,如元組:
def recur(n=()):
if len(n) > 4:
return n
return recur(n + (len(n),))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.