LEGB rule, totally confused ...
Neil Cerutti
horpner at yahoo.com
Tue Aug 14 09:32:40 EDT 2007
On 2007-08-14, stef mientki <stef.mientki at gmail.com> wrote:
> I've thought many times I finally understood the import /
> namespace rules, but again I'm totally lost :-(
>
> This is my library file
>
> # Module lib_test.py
>
> X = 1
>
> def Init():
> global X
> X = 3
> print 'Init', X
>
> def Run ():
> print X <=== UnboundLocalError: local variable
> 'X' referenced before assignment
> X = X + 1
> print ' Run', X
>From _Python Language Reference Manual_ see: '4.1 Naming and
Binding' and '6.13 The global statement'.
If a name is bound [assigned] in a block, it is a local
variable of that block.
...
The global statement is a declaration which holds for the
entire current code block. It means that the listed identifiers
are to be interpreted as globals. It would be impossible to
assign to a global variable without global, although free
variables may refer to globals without being declared global.
Since your Init and Run functions both assign (bind) a value to
X, X is assumed to be a local variable unless you say otherwise
with a global statement.
Note that the global statement in Init applies only in Init's
code block. Run must have it's own 'global X' statement, if
applicable.
--
Neil Cerutti
More information about the Python-list
mailing list