函数中静态变量的Python等价物是什么?

2024-04-25 20:34:57 发布

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

这个C/C++代码的惯用的Python等价物是什么?

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

具体来说,如何在函数级实现静态成员,而不是类级?把函数放到类中会改变什么吗?


Tags: 函数代码fooiscounter静态static成员
3条回答

人们还可以考虑:

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

推理:

  • 多管闲事(“请求宽恕而不是允许”)
  • 使用异常(只抛出一次)而不是if分支(想想StopIteration异常)

有点颠倒,但这应该有效:

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

如果希望计数器初始化代码位于顶部而不是底部,可以创建一个decorator:

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

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

相关问题 更多 >