## page was renamed from Asking for Help/globals ## Replace the ... text below with a title and a summary of the problem. ## Feel free to remove any remaining comments once you're done! = 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(). ## Insert your problem description here. You may provide code samples using syntax like this: {{{#!python def fun(): global a,b a = [0]*1 b = 0 fun1() def fun1(): a[0] += 1 print('a[0]: ', a[0]) b += 1 print('b: ', b) fun() b += 1 UnboundLocalError: local variable 'b' referenced before assignment }}} 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 = `), 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 <> ---- CategoryAskingForHelp CategoryAskingForHelpAnswered