Overthrow, Déclaration globale Python

déclaration globale

Le thème concerne la portée de la déclaration glabal dans Python 3. J'ai perdu quelques heures parce que la partie définition était ambiguë, mais j'ai fait des recherches et appris diverses choses, donc je vais garder un registre.

Exemple d'échec

Ce code est très facile à écrire. Ce n'est qu'un échantillon.

sample.py


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

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

if __name__ == '__main__':
    main()

Je me demande si 20 sera produit dans les deux cas.

bash


$ python3 sample1.py 
func x=20
x du principal=10

Pourquoi? ?? !! !! Déclarez global! !! J'ai cherché pendant quelques heures, mais cela a été résolu. ↓↓ rue.

L'important est la portée

La déclaration dans «global x» signifie les deux suivants.

--S'il y a un objet x dans la portée globale, il peut être traité comme une ** variable globale x ** dans le bloc de code (voir = même identité). --S'il n'y a pas d'objet x dans la portée globale, déclarez-le comme une nouvelle ** variable globale x ** ([Ce x peut être géré à partir de la portée globale](https://snowtree-injune.com/2018/12/13/global- nonlocal / # toc6)))

Dans le code précédent, x existait en fait dans main () (= portée locale), pas dans la portée globale. En d'autres termes, la variable globale x déclarée dans ** func () était complètement différente de la variable locale x dans main (). ** **

Solution

Déclarez x dans la portée globale, pas dans la portée locale appelée main ().

sample.py


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

def main():
    # x =10 C'est la portée locale
    func()
    print(f'x du principal={x}') #Vous pouvez vous référer aux variables globales (détails au bas de cet article)

if __name__ == '__main__':
    x = 10 #Définir x dans une portée globale
    main()

bash


$ python3 test.py 
func x=20
x du principal=20

Def main & ʻif name ==‘ __ main__ ’: ʻSi vous avez simplement écrit les instructions pour la partie main () sans rien faire, ce problème ne se serait pas produit ...

La déclaration globale n'est valide que dans ce bloc de code

sample.py


def func():
    #global x Si vous ne déclarez pas global ici
    x = 20
    print(f'func x={x}')

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

if __name__ == '__main__':
    x = 10 #Définir x dans une portée globale
    main()

bash


$ python3 sample1.py
func x=20
x du principal=10

Depuis que j'ai fait une déclaration globale dans main (), je me suis demandé si j'avais besoin d'une déclaration globale dans func () appelée à partir de là, mais ce n'était pas le cas.

Voir le dogme Documentation officielle pour voir pourquoi. C'est assez facile à comprendre si vous le relisez.

L'instruction globale est une instruction déclarative qui est maintenue tout au long du bloc de code actuel. L'instruction globale signifie spécifier que les identificateurs répertoriés doivent être interprétés comme des variables globales. Il n'est pas possible d'affecter une variable globale sans utiliser global, mais vous pouvez utiliser une variable libre pour référencer une variable globale sans la déclarer globale.

Le fait que la déclaration soit maintenue dans ** "tout le bloc de code courant" **, à l'inverse, n'a-t-il aucun effet en dehors du bloc de code? Au moment où «x = 20» est assigné (défini) dans func (), on considère que la variable locale x a été définie au lieu de réécrire la variable globale.

Solution

sample.py


def func():
    global x #func()Déclaration globale
    x = 20
    print(f'func x={x}')

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

if __name__ == '__main__':
    x = 10 #Définir x dans une portée globale
    main()

bash


$ python3 test.py 
func x=20
x du principal=20

Si vous déclarez global à la fois dans main () et func (), vous pouvez traiter x dans la portée globale comme la variable globale x de la même manière.

Il peut être référencé sans déclaration globale.

Pour ton information. Vous pouvez faire référence à des objets dans la portée globale sans déclarer global. Bien sûr, il ne peut pas être réécrit. Défini comme variable locale au moment où vous attribuez une valeur.

sample.py


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

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

if __name__ == '__main__':
    x = 10 #Définir x dans une portée globale
    main()

bash


$ python3 test.py 
func x=20
x du principal=10

Ni l'un ni l'autre n'est déclaré global. Main () peut faire référence à x dans la portée globale car il ne peut faire référence qu'à la variable globale. Dans func (), la variable locale x est définie au moment où «x = 20» est exécutée, et elle sera traitée comme une chose complètement différente de la variable globale x dans la portée globale.

Résumé

Si vous faites quelque chose auquel vous n'êtes pas habitué, vous serez coincé à divers endroits. Faisons-le parce que vous approfondirez votre apprentissage (je veux le croire) en lisant le document de la solution.

Ci-dessous, des articles faciles à comprendre en étudiant cette fois (même si j'ai un lien dans le texte)