[英]A new way to keep track of global variables inside a recursive function in Python?
所以我遇到了一個問題的遞歸解決方案,它以不同於我以前見過的方式跟蹤全局變量。 我知道兩種方法:
一種是使用global關鍵字:
count = 0
def global_rec(counter):
global count
count += 1
# do stuff
print(count)
另一個使用默認變量:
def variable_recursive(counter, count=0):
count += 1
if counter <= 0:
return count
return variable_recursive(counter-1, count)
新方式:
#driver function
def driver(counter):
#recursive function being called here
rec_utility.result = 0 <---initializing
rec_utility(counter) <--- calling the recursive function
print(rec_utility.result)
def rec_utility(counter):
if counter <= 0:
return
rec_utility.result += 1 <---- 'what is happening here'
rec_utility(counter-1)
我發現這種方式要簡單得多,因為在默認變量方法中,我們必須返回我們想要跟蹤的變量,並且代碼很快就會變得非常混亂。 有人可以解釋為什么將可變關節傳遞給 function,比如 object 屬性有效嗎? 我知道 python 函數只不過是對象,但這是一種跟蹤變量的黑客方式還是常見的做法? 如果是這樣,為什么我們有這么多方法來完成同樣的任務? 謝謝!
這並不像你想象的那么神奇。 這可能是不好的做法。
rec_utility
只是你命名空間中的一個變量,它恰好是一個 function。 dir()
將在 scope 中列出它。 作為 object 它可以設置新字段。 dir(rec_utility)
將顯示這些新字段以及__code__
和其他字段。
像任何 object 一樣,您可以設置一個新的字段值,就像您在代碼中所做的那樣。 只有一個rec_utility
function,即使你遞歸調用它,所以當你初始化它和修改它時它是同一個字段。
一旦你理解了它,你就可以決定它是否是一個好主意。 使用參數可能不太容易混淆或容易出錯。
從某種意義上說,這個問題與遞歸函數無關。 假設一個 function 需要一個信息項才能正確運行,那么你會:
在最后一種情況下,值得考慮的是它並不完全健壯:
def f():
# f is not this function!!
return f.x + 1
f.x = 100
for f in range(10): pass
一般來說,我們會認為第二個選項是最好的。 除了需要為下一次調用提供 state(即信息)之外,它的遞歸性質並沒有什么特別之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.