Sturz, Python Global Declaration

globale Erklärung

Das Thema befasst sich mit dem Umfang der glabalen Deklaration in Python 3. Ich habe ein paar Stunden verschwendet, weil der Definitionsteil nicht eindeutig war, aber ich habe verschiedene Dinge recherchiert und gelernt, also werde ich ein Protokoll führen.

Beispiel für einen Fehler

Dieser Code ist sehr einfach zu schreiben. Es ist nur ein Beispiel.

sample.py


def func():
    global x
    x = 20
    print(f'func x={x}')

def main():
    x = 10
    func()
    print(f'x von main={x}')

if __name__ == '__main__':
    main()

Ich frage mich, ob in beiden Fällen 20 ausgegeben werden.

bash


$ python3 sample1.py 
func x=20
x von main=10

Warum? ?? !! !! Global deklarieren! !! Ich habe ein paar Stunden gesucht, aber es wurde gelöst. ↓↓ Straße.

Das Wichtigste ist der Umfang

Die Deklaration in "global x" bedeutet die folgenden zwei.

Im vorherigen Code war x tatsächlich in main () (= lokaler Bereich) vorhanden, nicht im globalen Bereich. Mit anderen Worten, die in ** func () deklarierte globale Variable x unterschied sich vollständig von der lokalen Variablen x in main (). ** ** **

Lösung

Deklarieren Sie x im globalen Bereich, nicht im lokalen Bereich main ().

sample.py


def func():
    global x
    x = 20
    print(f'func x={x}')

def main():
    # x =10 Dies ist der lokale Bereich
    func()
    print(f'x von main={x}') #Sie können auf globale Variablen verweisen (Details am Ende dieses Artikels).

if __name__ == '__main__':
    x = 10 #Definieren Sie x im globalen Bereich
    main()

bash


$ python3 test.py 
func x=20
x von main=20

def main &if __name__ == '__ main__':Wenn Sie einfach die Anweisung für den main () - Teil geschrieben hätten, ohne etwas zu tun, wäre dieses Problem nicht aufgetreten ...

Die globale Deklaration ist nur innerhalb dieses Codeblocks gültig

sample.py


def func():
    #global x Wenn Sie hier nicht global deklarieren
    x = 20
    print(f'func x={x}')

def main():
    global x
    func()
    print(f'x von main={x}')

if __name__ == '__main__':
    x = 10 #Definieren Sie x im globalen Bereich
    main()

bash


$ python3 sample1.py
func x=20
x von main=10

Da ich in main () eine globale Deklaration abgegeben habe, habe ich mich gefragt, ob ich eine globale Deklaration in func () benötige, die von dort aufgerufen wird, aber das war nicht der Fall.

Weitere Informationen finden Sie im Dogma Offizielle Dokumentation. Es ist ziemlich leicht zu verstehen, wenn Sie es noch einmal lesen.

Die globale Anweisung ist eine deklarative Anweisung, die im gesamten aktuellen Codeblock beibehalten wird. Die globale Anweisung bedeutet anzugeben, dass die aufgelisteten Bezeichner als globale Variablen interpretiert werden sollen. Es ist nicht möglich, einer globalen Variablen zuzuweisen, ohne global zu verwenden. Sie können jedoch eine freie Variable verwenden, um auf eine globale Variable zu verweisen, ohne sie als global zu deklarieren.

Hat die Tatsache, dass die Deklaration in ** "dem gesamten aktuellen Codeblock" ** beibehalten wird, umgekehrt keine Auswirkung außerhalb des Codeblocks? In dem Moment, in dem "x = 20" in func () zugewiesen (definiert) wird, wird angenommen, dass die lokale Variable x definiert wurde, anstatt die globale Variable neu zu schreiben.

Lösung

sample.py


def func():
    global x #func()Globale Erklärung
    x = 20
    print(f'func x={x}')

def main():
    global x
    func()
    print(f'x von main={x}') 

if __name__ == '__main__':
    x = 10 #Definieren Sie x im globalen Bereich
    main()

bash


$ python3 test.py 
func x=20
x von main=20

Wenn Sie sowohl in main () als auch in func () global deklarieren, können Sie x im globalen Bereich auf dieselbe Weise als globale Variable x behandeln.

Es kann ohne globale Deklaration referenziert werden.

für Ihre Information. Sie können auf Objekte im globalen Bereich verweisen, ohne global zu deklarieren. Natürlich kann es nicht umgeschrieben werden. Als lokale Variable definiert, sobald Sie einen Wert zuweisen.

sample.py


def func():
    x = 20
    print(f'func x={x}')

def main():
    func()
    print(f'x von main={x}') 

if __name__ == '__main__':
    x = 10 #Definieren Sie x im globalen Bereich
    main()

bash


$ python3 test.py 
func x=20
x von main=10

Weder wird als global deklariert. Main () kann im globalen Bereich auf x verweisen, da es nur auf die globale Variable verweisen kann. In func () wird die lokale Variable x in dem Moment definiert, in dem "x = 20" ausgeführt wird, und sie wird als eine völlig andere Sache als die globale Variable x im globalen Bereich behandelt.

Zusammenfassung

Wenn Sie etwas tun, an das Sie nicht gewöhnt sind, bleiben Sie an verschiedenen Stellen stecken. Lassen Sie es uns tun, weil Sie Ihr Lernen vertiefen werden (ich möchte glauben), während Sie das Dokument für die Lösung lesen.

Unten Artikel, die während des Studiums dieses Mal leicht zu verstehen waren (obwohl ich einen Link im Text habe)