This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author Dominik V.
Recipients Dominik V., docs@python
Date 2020-12-08.10:19:26
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1607422767.08.0.320752230073.issue42597@roundup.psfhosted.org>
In-reply-to
Content
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)?
History
Date User Action Args
2020-12-08 10:19:27Dominik V.setrecipients: + Dominik V., docs@python
2020-12-08 10:19:27Dominik V.setmessageid: <1607422767.08.0.320752230073.issue42597@roundup.psfhosted.org>
2020-12-08 10:19:27Dominik V.linkissue42597 messages
2020-12-08 10:19:26Dominik V.create