簡體   English   中英

遞歸python函數中的持久對象

[英]Persistent objects in recursive python functions

我正在嘗試編寫一個遞歸函數,需要在遞歸時存儲和修改對象(比如一個集合)。 我應該在函數內部使用全局名稱嗎? 另一種選擇是修改或繼承函數參數的類,以便它可以保留這個持久對象,但我發現它並不優雅。 如果我完全放棄遞歸,我也可以使用堆棧...

有這樣做的pythonic方式嗎? 發電機可以做到這一點嗎?

只需通過遞歸方法傳遞持久對象。

def recursivemethod(obj_to_act_on, persistent_obj=None):

    if persistent_obj == None:
        persistent_obj = set()

    # Act on your object

    return recursivemethod(newobj, persistent_obj)

將集合作為參數傳遞給遞歸方法,然后在將其傳遞到下一步之前將其修改。 復雜對象通過引用傳遞。

對象通過引用傳遞。 如果您只修改對象,則可以在遞歸函數中執行此操作,並且更改將全局可見。

如果需要在遞歸函數中分配變量並在函數返回后看到它,那么您不能只使用=分配局部變量。 你可以做的是更新另一個對象的字段。

class Accumulator: pass

def foo():
    # Create accumulator
    acc = Accumulator()
    acc.value = 0

    # Define and call a recursive function that modifies accumulator
    def bar(n):
        if (n > 0): bar(n-1)
        acc.value = acc.value + 1
    bar(5)

    # Get accumulator
    return acc.value

如果它是一個容器(不是不可變數據類型),則可以通過以下方式傳遞對象:

import random

def foo(bar=None, i=10):
    if bar is None:
        bar = set()
    if i == 0:
        return bar
    bar |= set(random.randint(1, 1000) for i in xrange(10))
    return foo(bar, i - 1)

random_numbers_set = foo()

(不要問我這是做什么的......我只是在輸入隨機的東西:P)

如果您傳遞的對象是可變的,那么在更早的遞歸中將會看到更深層遞歸的更改。

  1. 對函數使用變量global。

  2. 將對象作為累加器傳遞:

     def recurse(foo, acc=None): acc = {} recurse(acc) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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