协慌网

登录 贡献 社区

函数中静态变量的 Python 等效项是什么?

此 C / C ++ 代码的惯用 Python 等效项是什么?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %d\n", counter);
}

具体来说,如何在函数级别(而不是在类级别)实现静态成员?并将函数放入类中是否会发生任何变化?

答案

有点相反,但这应该起作用:

def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
foo.counter = 0

如果要将计数器初始化代码放在顶部而不是底部,则可以创建一个装饰器:

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

然后使用如下代码:

@static_vars(counter=0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

仍然需要您使用foo.前缀,很不幸。

(信用: @ony

您可以向函数添加属性,并将其用作静态变量。

def myfunc():
  myfunc.counter += 1
  print myfunc.counter

# attribute must be initialized
myfunc.counter = 0

另外,如果您不想在函数外部设置变量,则可以使用hasattr()避免AttributeError异常:

def myfunc():
  if not hasattr(myfunc, "counter"):
     myfunc.counter = 0  # it doesn't exist yet, so initialize it
  myfunc.counter += 1

无论如何,静态变量很少见,您应该为该变量找到一个更好的位置,很可能在类中。

还可以考虑:

def foo():
    try:
        foo.counter += 1
    except AttributeError:
        foo.counter = 1

推理:

  • 大量 pythonic(“请求宽恕而不是许可”)
  • 使用异常(仅抛出一次)而不是if分支(认为StopIteration异常)