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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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
  • Odpowiedz