Joel Goldstick wrote: > On Mon, Nov 10, 2014 at 6:39 AM, Wolfgang Maier > <wolfgang.ma...@biologie.uni-freiburg.de> wrote: >> You may want to read: >> >> https://docs.python.org/3/faq/programming.html?highlight=global#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value >> >> from the Python docs Programming FAQ section. >> It explains your problem pretty well. >> >> As others have hinted at, always provide concrete Python error messages >> and tracebacks instead of vague descriptions. >> >> Best, >> Wolfgang >> >> >> >> On 11/10/2014 12:07 PM, Mok-Kong Shen wrote: >>> >>> >>> I don't understand the following phenomenon. Could someone kindly >>> explain it? Thanks in advance. >>> >>> M. K. Shen >>> >>> ------------------------------------------------- >>> >>> count=5 >>> >>> def test(): >>> print(count) >>> if count==5: >>> count+=0 ### Error message if this line is active, otherwise ok. >>> print(count) >>> return >>> >>> test() >> >> >> -- >> https://mail.python.org/mailman/listinfo/python-list > > Your problem is that count is not local. You are reading count from > an outer scope. When you try to increment count in your function, it > can't because it doesn't exist. > Don't use globals.
That's what most would expect, but the error is already triggered by the first print(count) Python decides at compile-time that count is a local variable if there is an assignment ("name binding") to count anywhere in the function's scope -- even if the corresponding code will never be executed: >>> x = 42 >>> def test(): ... print(x) ... if 0: x = 42 ... >>> test() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test UnboundLocalError: local variable 'x' referenced before assignment This is different from the class body where the global namespace is tried when a lookup in the local namespace fails: >>> x = 42 >>> class A: ... print(x) ... x += 1 ... 42 >>> x 42 >>> A.x 43 Historical ;) note: In Python 2 you could trigger a similar behaviour with exec: >>> def f(a): ... if a: exec "x = 42" ... print x ... >>> x = "global" >>> f(True) 42 >>> f(False) global -- https://mail.python.org/mailman/listinfo/python-list