What exactly are the Python scoping rules?
If I have some code:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
Where is x
found? Some possible choices include the list below:
- In the enclosing source file
- In the class namespace
- In the function definition
- In the for loop index variable
- Inside the for loop
Also there is the context during execution, when the function spam
is passed somewhere else. And maybe lambda functions pass a bit differently?
There must be a simple reference or algorithm somewhere. It’s a confusing world for intermediate Python programmers.
Actually, a concise rule for Python Scope resolution, from Learning Python, 3rd. Ed.. (These rules are specific to variable names, not attributes. If you reference it without a period, these rules apply.)
LEGB Rule
-
Local — Names assigned in any way within a function (def
or lambda
), and not declared global in that function
-
Enclosing-function — Names assigned in the local scope of any and all statically enclosing functions (def
or lambda
), from inner to outer
-
Global (module) — Names assigned at the top-level of a module file, or by executing a global
statement in a def
within the file
-
Built-in (Python) — Names preassigned in the built-in names module: open
, range
, SyntaxError
, etc
So, in the case of
code1
class Foo:
code2
def spam():
code3
for code4:
code5
x()
The for
loop does not have its own namespace. In LEGB order, the scopes would be
- L: Local in
def spam
(in code3
, code4
, and code5
)
- E: Any enclosing functions (if the whole example were in another
def
)
- G: Were there any
x
declared globally in the module (in code1
)?
- B: Any builtin
x
in Python.
x
will never be found in code2
(even in cases where you might expect it would, see Antti’s answer or here).