一种跟踪Python递归函数中全局变量的新方法?

2024-05-14 15:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我遇到了一个问题的递归解决方案,它以不同于我以前看到的方式跟踪全局变量。我知道两种方法:

一种是使用全局关键字:

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)

我发现这种方法简单得多,因为在默认变量方法中,我们必须返回要跟踪的变量,代码很快就会变得非常混乱。有人能解释一下为什么像对象属性一样将变量连接传递给函数?我知道python函数只不过是对象,但这是一种跟踪变量的黑客方法还是一种常见的做法?如果是这样,为什么我们有这么多方法来完成同样的任务?谢谢


Tags: 方法returnifdefdrivercountcounterfunction
2条回答

这并不像你想象的那么神奇。这可能是不好的做法

rec_utility只是命名空间中的一个变量,恰好是一个函数dir()将在它在范围内时显示它。作为一个对象,它可以设置新的字段dir(rec_utility)将显示这些新字段,以及__code__和其他字段

像任何对象一样,您可以设置一个新的字段值,就像您在代码中所做的那样。只有一个rec_utility函数,即使您递归调用它,所以在初始化它和修改它时它都是同一个字段

一旦你明白了,你就可以决定这是否是个好主意。使用参数可能不那么容易混淆或出错

在某种意义上,这个问题与递归函数无关。假设函数需要一项信息才能正确运行,那么您是否:

  1. 通过全球网络提供;或者
  2. 作为参数传入;或者
  3. 在调用之前将其设置为函数属性

在最后一种情况下,值得考虑的是它并不完全健壮:

def f():
    # f is not this function!!
    return f.x + 1

f.x = 100

for f in range(10): pass

一般来说,我们认为第二种选择是最好的。它的递归本质并没有什么特别之处,只是需要向下一次调用提供状态(即信息)

相关问题 更多 >

    热门问题