Alles, was Sie über den Umfang in Python wissen wollten, aber es war Ihnen peinlich zu fragen

In Erwartung des Starts eines neuen Threads im Kurs "Python Developer" haben wir beschlossen, über den Umfang in Python zu sprechen. Was ist daraus geworden? - Lesen Sie das folgende Material.




Heute werden wir über wichtige theoretische Grundlagen sprechen, die verstanden und erinnert werden müssen, um kompetenten, lesbaren und schönen Code zu schreiben. Wir werden über den Umfang der Variablen sprechen. Dieser Artikel ist nicht nur für Anfänger nützlich, sondern auch für erfahrene Programmierer, die aus einer anderen Sprache zu Python gekommen sind und dessen Mechanik verstehen möchten.

Bereiche bestimmen, in welchem ​​Teil des Programms wir mit einer bestimmten Variablen arbeiten können und vor welchem ​​die Variable „versteckt“ ist. Es ist äußerst wichtig zu verstehen, wie nur die Werte und Variablen verwendet werden, die wir benötigen, und wie sich der Sprachinterpreter verhält. Wir werden auch sehen, wie Sie die Einschränkungen umgehen können, die durch den Umfang von Aktionen mit Variablen auferlegt werden. In Python gibt es bis zu drei Bereiche:

  • Lokal
  • Global
  • Nicht lokal

Der letzte nichtlokale Bereich wurde in Python 3 hinzugefügt.

Normalerweise sprechen wir über den Bereich, wenn wir mit Funktionen vertraut sind. Anhand ihres Beispiels werden wir die Arbeit des Variablenumfangs betrachten.

Lokaler Bereich


Stellen Sie sich eine Funktion vor, die eine Liste some_listElement für Element anzeigt :

def print_list(some_list):
    for element in some_list:
        print(element)

Hier elementund some_listsind lokale Variablen , die nur innerhalb der Funktion sichtbar sind, und die sich nicht außerhalb mit den Werten verwendet werden, die sie in der Funktion während des Betriebes zugewiesen wurden. Das heißt, wenn wir den Hauptteil des Programms aufrufen print(element), erhalten wir eine Fehlermeldung:

NameError: name 'element' is not defined


Jetzt machen wir folgendes:

def print_list(some_list):
    for element in some_list:
        print(element) 

element = 'q'
print_list([1, 2, 3])
print(element) 


Und wir bekommen:

1
2
3
q

Hier sind die Variable elementinnerhalb der Funktion und die Variable mit demselben Namen außerhalb der Funktion zwei verschiedene Variablen, deren Werte sich nicht kreuzen und nicht austauschen. Sie werden als gleich bezeichnet, beziehen sich jedoch auf verschiedene Objekte im Speicher. Darüber hinaus lebt eine Variable mit dem Namen element innerhalb der Funktion so lange, wie die Funktion ausgeführt wird, und nicht mehr. Aber seien Sie vorsichtig, um lokalen und globalen Variablen den gleichen Namen zu geben. Jetzt werde ich zeigen, warum:

def print_list(some_list):
    for element in sudden_list:
        print(element) 

sudden_list = [0, 0, 0]
print_list([1, 2, 3])

Ergebnis:

0
0
0

Bitte beachten Sie, dass der Dolmetscher uns keine Fehler angezeigt hat. Und das alles, weil es sudden_listim globalen Bereich liegt, dh von der Innenseite der Funktion print_listaus können wir darauf zugreifen, weil Sie von innen sehen können, was draußen passiert. Versuchen Sie aus Gründen dieser Arbeitsmechanik, lokale Variablen innerhalb der Funktion anders zu benennen als die Variablen, die Sie im globalen Bereich nennen.

Es ist wichtig, hier über Konstanten zu sprechen. Für den Python-Interpreter gibt es keinen Unterschied, was Sie als Variable bezeichnen. Daher sollte der obige Code wie folgt umgeschrieben werden:

SUDDEN_LIST = [0, 0, 0]

def print_list(some_list):
    for element in SUDDEN_LIST:
        print(element) 

print_list([1, 2, 3]) 

Jetzt ist alles an Ort und Stelle. Die Sache ist, in Python kann man eine Konstante nicht streng als ein Objekt definieren, das nicht geändert werden sollte. Die Art und Weise, wie Sie den Wert einer Variablen verwenden, deren Name in Großbuchstaben geschrieben ist, bleibt also nur Ihrem Gewissen überlassen. Eine andere Frage ist, dass auf diese Weise die aufgezeichnete Variable jedem, der Ihren Code liest, klar macht, dass sich die Variable nirgendwo ändert. Oder sollte es zumindest nicht.

Globaler Geltungsbereich


Python hat ein Schlüsselwort global, mit dem Sie den Wert einer globalen Variablen innerhalb einer Funktion ändern können. Es wird vor dem Variablennamen geschrieben, der innerhalb der Funktion als global betrachtet wird. Wie Sie dem Beispiel entnehmen können, nimmt der Wert der Variablen jetzt zu. candyBeachten Sie, dass wir ihn nicht als Argument an die Funktion übergeben get_candy().

candy = 5

def get_candy():
    global candy 
    candy += 1
    print('  {} .'.format(candy))
    
get_candy()
get_candy()
print(candy)


Als Ergebnis erhalten wir:


	  6 .
  7 .
7


Das Ändern des Werts einer globalen Variablen innerhalb der Funktion ist jedoch nicht die beste Vorgehensweise, und es ist besser, dies nicht zu tun, da dies nicht zur Lesbarkeit des Codes beiträgt. Je kleiner das, was innerhalb der Funktion passiert, vom globalen Bereich abhängt, desto besser.

Life Hack : Um nicht unter der Benennung von Variablen zu leiden, können Sie den Hauptprogrammcode in eine Funktion einfügen. main()Alle Variablen, die in dieser Funktion deklariert werden, bleiben lokal und beeinträchtigen den globalen Bereich nicht, wodurch die Wahrscheinlichkeit eines Fehlers erhöht wird.

Nichtlokaler Geltungsbereich


Dieses Konzept wurde in Python 3 zusammen mit dem Schlüsselwort angezeigt nonlocal. Die Logik seines Schreibens ist ungefähr die gleiche wie die von global. Es nonlocalgibt jedoch eine Funktion. NonlocalEs wird am häufigsten in verschachtelten Funktionen verwendet, wenn der Interpreter verstehen soll, dass für eine verschachtelte Funktion eine bestimmte Variable nicht lokal, aber im allgemeinen Sinne nicht global ist.

def get_candy():
    candy = 5
    def increment_candy(): 
        nonlocal candy
        candy += 1
        return candy
    return increment_candy
    
result = get_candy()()
print(' {} .'.format(result))

Ergebnis:

 6 .

Wie nützlich es für Sie ist, selbst zu entscheiden. Weitere Beispiele finden Sie hier .

Abschließend können mehrere Regeln formuliert werden:

  1. Innerhalb der Funktion sind sichtbare Variablen sichtbar, die sowohl innerhalb als auch außerhalb der Funktion definiert wurden. Intern definierte Variablen sind lokal und extern global.
  2. Außerhalb von Funktionen sind keine darin definierten Variablen sichtbar.
  3. , global.
  4. nonlocal , , .

Das ist alles, ich hoffe, dieses Material war für Sie nützlich und gibt zumindest ein wenig Aufschluss darüber, wie der Bereich in Python funktioniert. Nachdem Sie sich mit Bereichen befasst haben, werden Sie eine weitere auf dem Weg zur Erstellung von schönem und lesbarem Code erstellen.

Ich möchte auch alle zu einem kostenlosen Webinar von OTUS einladen, in dem wir ein Tool wie die Typanmerkung in Python untersuchen: Besprechen Sie die Gründe, warum viele Menschen es unterschätzen, und betrachten Sie eine Reihe von Beispielen aus der Militärpraxis, bei denen die Typanmerkung die Situation retten oder retten könnte. Lassen Sie uns darüber sprechen, wie und wann die Typprüfung in Ihren Projekten implementiert werden soll .

All Articles