global/local variables

Tim Rau bladedpenguin at gmail.com
Fri Jan 25 02:04:42 EST 2008


On Jan 24, 7:09 pm, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> On Thu, 24 Jan 2008 15:37:09 -0800, Tim Rau wrote:
> > What makes python decide whether a particular variable
> > is global or local?
>
> For starters, if the line of code is not inside a class or function, that
> is, it's at the top level of a module, it is global.
>
> More interesting is if it is inside a function or class. If you assign to
> the name in the function, Python assumes it is local *unless* you have
> defined it as global with the global statement.
>
> Otherwise, Python will treat it as global.
>
> > I've got a list and a integer, both defined at top level, no
> > indentation, right next to each other:
>
> > allThings = []
> > nextID = 0
>
> > and yet, in the middle of a function, python sees one and doesn't see
> > the other:
>
> I've tried to run your code -- and it isn't easy, involving much
> backwards-and-forwards copying and pasting, thanks to word-wrap in you
> post -- and the error I get is:
>
> SyntaxError: invalid syntax
>
> because you left off the colon from the first if statement.
>
> I'm not especially inclined to start hunting through your code fixing any
> other errors in order to find the error you think you're getting. How
> about if you quote the exception traceback you actually get?
>
> > I don't think it's important, but the function is defined before
> > the two globals.
>
> Nope, not important. What's important is whether the function is *called*
> before or after the globals are created.
That's been my experience so far.

>
> If you're using global variables in your code, you probably should stop.
> As a general rule, global variables are poor programming practice for a
> number of reasons. Google on "Global variables considered harmful" for
> some examples.
>
> --
> Steven

I'm sorry: I forgot to say what my problem was. Python seems to think
that nextID is a local, and complains that it can't find it. THis is
not the full text of the function, just the level that is causing
errors. the lack of : on the if is a transcription error.
Traceback (most recent call last):
  File "C:\Documents and Settings\Owner\My Documents\NIm's code\sandbox
\sandbox.py", line 248, in <module>
    thing.step()
  File "C:\Documents and Settings\Owner\My Documents\NIm's code\sandbox
\sandbox.py", line 112, in step
    allThings[len(allThings)-1].id = nextID
UnboundLocalError: local variable 'nextID' referenced before
assignment

I want to know why it says 'local variable' it never had a problem
when just allThings was in there.

as for the objection to global variable: If I didn't make them global,
I'd make them part of a singleton class called gameVars that would get
passed everywhere. It's unlikely that they'll get mixed in with
anyhting else, as they fulfill a unique function. Also, I think it's
more convenient, and I am, after all, my own employer when it comes to
programming.



More information about the Python-list mailing list