簡體   English   中英

跟蹤 Python 中遞歸 function 中的全局變量的新方法?

[英]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 需要一個信息項才能正確運行,那么你會:

  1. 通過全球提供; 或者
  2. 將其作為參數傳入; 或者
  3. 在調用它之前將其設置為 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.

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