New submission from Dominik V. <dominik.vilsmeier1...@gmail.com>:

The documentation of locals() mentions that:

> Free variables are returned by locals() when it is called in function blocks 
> [...]

The term "free variable" is defined in the documentation about the execution 
model 
(https://docs.python.org/3/reference/executionmodel.html#binding-of-names):

> If a variable is used in a code block but not defined there, it is a free 
> variable.

That definition includes global variables (and builtin ones), but these are not 
returned by locals(). For example compare the following:

```
x = 1
def foo():
    # global x
    x = 1
    def bar():
        print(locals())
        y = x
    bar()
foo()
```

If the `global x` is commented then it prints {'x': 1}, and if it is 
uncommented it prints {}. The same holds for names of builtins.

So the documentation of locals() could mention this in the following way 
(emphasis added):

> Free variables *of enclosing functions* are returned by locals() when it is 
> called in function blocks [...]

-----

There is also a StackOverflow question, that describes this confusion: 
https://stackoverflow.com/questions/12919278/how-to-define-free-variable-in-python

By the way, would it be helpful to add the term "free variable" to the glossary 
(https://docs.python.org/3/glossary.html)?

----------
assignee: docs@python
components: Documentation
messages: 382721
nosy: Dominik V., docs@python
priority: normal
severity: normal
status: open
title: Improve documentation of locals() w.r.t. "free variables" vs. global 
variables
type: enhancement
versions: Python 3.10

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42597>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to