簡體   English   中英

python:recurcive列表處理更改原始列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM