Wpis z mikrobloga

Siema, próbuję rozkminić temat scope i namespace. Tutaj mam taki przykładowy kod z dokumentacji pythona:

https://pastebin.com/9cRk5GmF

I tutaj jest moje pytanie: dlaczego po wywołaniu funkcji doglobal() i sprintowaniu w linijce 19 w outpucie dostajemy:

After global assignment: nonlocal spam? Czy nie powinno być 'After global assignment: global spam' skoro mamy deklarację globalną zmiennej spam?

W pythontutorze pokazuje to tak jakby została stworzona zmienna spam = "global spam" w obrębie modułu ale poza funkcją scope
test() a w obrębie tej funkcji działała wciąż zmienna spam = "nonlocal spam" przypisana dzięki funkcji do_nonlocal().

Trochę chaotycznie napisałem ale mam nadzieję, że byłby skłonny ktoś mnie naprowadzić. Dlaczego tak się dzieje?

#python
  • 4
@ja_po_film_xD: "Zakres leksykalny, który jest pokazany w tym przykładzie, działa tylko dla przestrzeni nazw funkcji. Wyobraź sobie, że miałoby to działać w klasie — wtedy wszystkie metody klasy byłyby w stanie uzyskać dostęp do atrybutów klasy bezpośrednio, zamiast przez parametr self lub nazwę klasy, gdy rzeczy faktycznie działają.

Innymi słowy, przestrzeń nazw klasy nie wprowadza otaczającego zakresu dla metod w klasie, co również uniemożliwia nielokalnym znajdowanie powiązań na poziomie treści klasy."
dlaczego po wywołaniu funkcji doglobal() i sprintowaniu w linijce 19 w outpucie dostajemy:

After global assignment: nonlocal spam?


@ja_po_film_xD: Więc tak:

tam masz:
19. print("After global assignment:", spam)

Ta zmienna spam to jest ta sama, która jest w linijce:
13. spam = "test spam"

Ale ta zmienna z linijki 13 została wcześniej zamieniona w funkcji:
def dononlocal():
nonlocal spam
spam = "nonlocal spam"

I tutaj chodziło o pokazanie, że jak