什么是函数内部的静态变量的Python等价物?
这个C / C ++代码的惯用Python等价物是什么?
void foo()
{
static int counter = 0;
counter++;
printf("counter is %dn", counter);
}
具体而言,如何在功能级别实现静态成员,而不是类级别? 并且将函数放入类中是否会改变任何内容?
有点逆转,但这应该工作:
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
foo.counter = 0
如果你想在顶部而不是底部计数器初始化代码,你可以创建一个装饰器:
def static_var(varname, value):
def decorate(func):
setattr(func, varname, value)
return func
return decorate
然后使用这样的代码:
@static_var("counter", 0)
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
它仍然会要求你使用foo.
前缀,不幸的。
编辑(感谢ony):这看起来更好:
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
您可以将属性添加到函数中,并将其用作静态变量。
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
推理:
ask for forgiveness not permission
) if
分支(认为StopIteration异常) 上一篇: What is the Python equivalent of static variables inside a function?