67 9.2. Python Scopes and Namespaces Python Tutorial, Release 3.9.5 It is important to realize that scopes are determined textually: the global scope of a function defined in a module is that module’s namespace, no matter from where or by what alias the function is called. On the other hand, the actual search for names is done dynamically, at run time — however, the language definition is evolving towards static name resolution, at “compile” time, so don’t rely on dynamic name resolution! (In fact, local variables are already determined statically.) A special quirk of Python is that – if no$_{global}$ or$_{nonlocal}$ statement is in effect – assignments to names always go into the innermost scope. Assignments do not copy data — they just bind names to objects. The same is true for deletions: the statement del x removes the binding of x from the namespace referenced by the local scope. In fact, all operations that introduce new names use the local scope: in particular, import statements and function definitions bind the module or function name in the local scope. The$_{global}$ statement can be used to indicate that particular variables live in the global scope and should be rebound there; the nonlocal statement indicates that particular variables live in an enclosing scope and should be rebound there. This is an example demonstrating how to reference the different scopes and namespaces, and how global and nonlocal affect variable binding: 9.2.1 Scopes and Namespaces Example Note how the local assignment (which is default) didn’t change scope_test ’s binding of spam . The$_{nonlocal}$ as- signment changed scope_test ’s binding of spam , and the$_{global}$ assignment changed the module-level binding. You can also see that there was no previous binding for spam before the$_{global}$ assignment. The output of the example code is: def scope_test(): def do_local (): spam ="local spam " def do_nonlocal (): nonlocal spam spam ="nonlocal spam " def do_global (): global spam spam ="global spam " spam ="test spam" do_local() print("After local assignment: ", spam) do_nonlocal() print("After nonlocal assignment: ", spam) do_global() print("After global assignment: ", spam) scope_test() print("In global scope: ", spam) After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam