C-style static variables in Python?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Fri Apr 2 14:40:28 EDT 2010


On Fri, 02 Apr 2010 16:08:42 +0000, kj wrote:

> Other responses advocated for global variables.  I avoid them in
> general, 

In general this is wise, but remember that because Python globals are not 
globally global, but local to a single module, they're safer than globals 
in other languages. Still, it's better to avoid them when possible.


> and doubly so in Python, because I find Python's shenanigans
> with globals mystifying (this business of becoming silently local if
> assigned to); 

Globals don't become local when assigned to. You can shadow a global with 
a local of the same name, but the global remains untouched:

>>> myglobal = 42
>>> def test():
...     myglobal = 0  # shadow the global with a new local
...
>>> test()
>>> myglobal
42

I find this behaviour perfectly natural, and desirable: it means I can 
assign to locals without worrying whether or not I'm about to stomp all 
over a global and destroy it. The alternative behaviour would be 
disastrous:

>>> def f(x): return x+1
... 
>>> def test():
...     f = 'spam'
...
>>> test()
>>> f(2)  # this doesn't happen
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable



-- 
Steven



More information about the Python-list mailing list