What is the Python equivalent of static variables inside a function? What is the Python equivalent of static variables inside a function? python python

What is the Python equivalent of static variables inside a function?


A bit reversed, but this should work:

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

If you want the counter initialization code at the top instead of the bottom, you can create a decorator:

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

Then use the code like this:

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

It'll still require you to use the foo. prefix, unfortunately.

(Credit: @ony)


You can add attributes to a function, and use it as a static variable.

def myfunc():  myfunc.counter += 1  print myfunc.counter# attribute must be initializedmyfunc.counter = 0

Alternatively, if you don't want to setup the variable outside the function, you can use hasattr() to avoid an AttributeError exception:

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

Anyway static variables are rather rare, and you should find a better place for this variable, most likely inside a class.


One could also consider:

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

Reasoning:

  • much pythonic ("ask for forgiveness not permission")
  • use exception (thrown only once) instead of if branch (think StopIteration exception)