Asking for Help: Why is my global not assigned?
The following puzzles me: Both a and b are globals. Both are assigned an initial value in fun(). But b is considered unassigned in fun1().
The purpose of global is to indicate which names are global in that specific part of a program. So, although you have indicated that b is global in fun, you still need to indicate that b is global in fun1. Otherwise, Python doesn't know where to get b from. It's actually slightly more complicated than this; for more, see below.
Now, you do manage to get away with not declaring a as global in both functions. The reason for this is that you aren't changing what a refers to, but are instead modifying an item (or element) in what a refers to (a list). So, Python deduces that a is a global and doesn't change its mind about it: a isn't itself made to refer to something else in fun1, so any reference to a is always to a global object.
So, back to the problem with b. When Python compiles fun1, it has to consider that b itself is being assigned to and that there's no global declaration for b in fun1. So, Python then believes b to be a local. But then, in the assignment itself, it has to get the value of b (think of it as b + 1; b = <result>), and at that point there is no such local, so you get the error.
In short, Python has to decide whether a name is local or global and stick with that decision for every mention of that name in a function: it can't switch between the two since it has to generate code that builds on the assumption that a name is always local or always global in that function. So you should always declare names as global in any function where you are assigning to them as globals. -- PaulBoddie 2012-04-24 20:57:57