[英]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)
如果您傳遞的對象是可變的,那么在更早的遞歸中將會看到更深層遞歸的更改。
對函數使用變量global。
將對象作為累加器傳遞:
def recurse(foo, acc=None): acc = {} recurse(acc)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.