Introduction aux variables globales et locales en Python

Publié: 2021-08-26

Python gère les variables d'une manière très indépendante. Alors que de nombreux langages de programmation considèrent les variables comme globales par défaut (à moins qu'elles ne soient déclarées comme locales), Python considère les variables comme locales à moins qu'elles ne soient déclarées dans l'autre sens. La raison principale pour laquelle Python considère les variables comme locales par défaut est que l'utilisation de variables globales est généralement considérée comme une mauvaise pratique de codage.

Ainsi, lors de la programmation en Python, lorsque la définition de variable se produit dans une fonction, elles sont locales par défaut. Toutes les modifications ou manipulations que vous apportez à cette variable dans le corps de la fonction resteront uniquement dans le cadre de cette fonction. Ou, en d'autres termes, ces changements ne seront reflétés dans aucune autre variable en dehors de la fonction, même si la variable porte le même nom que la variable de la fonction. Toutes les variables existent dans la portée de la fonction dans laquelle elles sont définies et conservent cette valeur. Pour acquérir une expérience pratique sur les variables et les projets Python, essayez nos certifications en science des données des meilleures universités américaines.

À travers cet article, explorons la notion de variables locales et globales en Python, ainsi que la manière dont vous définissez les variables globales. Nous examinerons également ce que l'on appelle les « variables non locales ».

Continuer à lire!

Table des matières

Variables globales et locales en Python

Regardons un exemple pour comprendre comment les valeurs globales peuvent être utilisées dans le corps d'une fonction en Python :

Programme:

def fonction() :

imprimer (chaîne)

chaîne = "J'aime Python !"

fonction()

Sortir

J'adore Python !

Comme vous pouvez le voir, la chaîne variable reçoit la valeur "J'aime Python!" avant que func() ne soit appelée. Le corps de la fonction se compose uniquement de l'instruction print. Comme il n'y a pas d'affectation à la variable chaîne dans le corps de la fonction, elle prendra la valeur de la variable globale à la place.

Par conséquent, la sortie sera quelle que soit la valeur globale de la chaîne variable, qui dans ce cas est "J'aime Python!".

Maintenant, changeons la valeur de string à l'intérieur de func() et voyons comment cela affecte les variables globales :

Programme:

def fonction() :

string = "J'adore Java !"

imprimer (chaîne)

chaîne = "J'aime Python !"

fonction()

imprimer (chaîne)

Sortir:

J'aime Java!

J'adore Python !

Dans le programme ci-dessus, nous avons défini une fonction func(), et à l'intérieur de celle-ci, nous avons une chaîne variable avec la valeur "J'aime Java!". Donc, cette variable est locale à la fonction func(). Ensuite, nous avons la variable globale comme précédemment, puis nous appelons la fonction et l'instruction print. Tout d'abord, la fonction est déclenchée, appelant l'instruction d'impression de cette fonction et délivrant la sortie "J'aime Java!" – qui est la variable locale de cette fonction. Ensuite, une fois que le programme est hors de portée de la fonction, la valeur de s est changée en "J'aime Python", et c'est pourquoi nous obtenons les deux lignes en sortie.

Maintenant, ajoutons les deux premiers exemples et essayons d'accéder à la chaîne à l'aide de l'instruction print, puis essayons de lui attribuer une nouvelle valeur. Essentiellement, nous essayons de créer une chaîne en tant que variable locale et globale.

Heureusement, Python ne permet pas cette confusion et génère une erreur. Voici comment:

Programme:

def fonction() :

imprimer (chaîne)

string = "J'adore Java !"

imprimer (chaîne)

chaîne = "J'aime Python !"

fonction()

Sortie (Erreur) :

—————————————————————————

UnboundLocalError Traceback (appel le plus récent en dernier)

<ipython-input-3-d7a23bc83c27> dans <module>

5

6 chaîne = "J'aime Python !"

—-> 7 fonction()

<ipython-input-3-d7a23bc83c27> dans func()

1 def fonction() :

—-> 2 impression(chaîne)

3 chaîne = "J'adore Java !"

4 caractères (chaîne)

5

UnboundLocalError : variable locale 's' référencée avant l'affectation

Évidemment, Python ne permet pas à une variable d'être à la fois globale et locale à l'intérieur d'une fonction. Ainsi, cela nous donne une variable locale puisque nous attribuons une valeur à la chaîne dans le func(). Par conséquent, la première instruction d'impression affiche la notification d'erreur. Toutes les variables créées ou modifiées dans le cadre de n'importe quelle fonction sont locales à moins qu'elles n'aient été explicitement déclarées comme « globales ».

Définir des variables globales en Python

Le mot-clé global est nécessaire pour informer Python que nous accédons à des variables globales. Voici comment:

Programme:

def fonction() :

chaîne globale

imprimer (chaîne)

string = "Mais je veux aussi apprendre Python !"

imprimer (chaîne)

string = "Je cherche à apprendre Java !"

fonction()

imprimer (chaîne)

Sortir:

Je cherche à apprendre Java !

Mais je veux aussi apprendre Python !

Mais je veux aussi apprendre Python !

Comme vous pouvez le voir à partir de la sortie, Python reconnaît les variables globales ici et évalue l'instruction print en conséquence, donnant une sortie appropriée.

Utilisation de variables globales dans les fonctions imbriquées

Examinons maintenant ce qui se passera si des variables globales sont utilisées dans des fonctions imbriquées. Découvrez cet exemple où la variable 'langue' est définie et utilisée dans diverses portées :

Programme:

def fonction() :

langue = "Anglais"

def fonction1() :

langue mondiale

langue = "espagnol"

print("Avant d'appeler fonc1 : " + langue)

print("Appeler la fonction1 maintenant :")

fonction1()

print("Après avoir appelé func1 : " + langue)

fonction()

print("Valeur de la langue dans main : " + langue)

Sortir:

Avant d'appeler func1 : anglais

Appel de func1 maintenant :

Après avoir appelé func1 : anglais

Valeur de la langue principale : espagnol

Comme vous pouvez le voir, le mot-clé global, lorsqu'il est utilisé dans le func1 imbriqué, n'a aucun impact sur la variable 'language' de la fonction parent. C'est-à-dire que la valeur est conservée comme "anglais". Cela montre également qu'après avoir appelé func(), une variable 'language' existe dans l'espace de noms du module avec une valeur 'Spanish'.

Cette découverte est également cohérente avec ce que nous avons découvert dans la section précédente - qu'une variable, lorsqu'elle est définie dans le corps d'une fonction, est toujours locale, sauf indication contraire. Cependant, il devrait y avoir un mécanisme pour accéder aux variables appartenant à différentes autres portées également.

C'est là qu'interviennent les variables non locales !

Variables non locales

Les variables non locales sont de nouveaux types de variables introduits par Python3. Celles-ci ont beaucoup en commun avec les variables globales et sont également extrêmement importantes. Cependant, une différence entre les variables non locales et globales est que les variables non locales ne permettent pas de modifier les variables de la portée du module.

Consultez les exemples suivants pour comprendre cela :

Programme:

def fonction() :

langue mondiale

imprimer (langue)

langue = "allemand"

fonction()

Sortir:

Allemand

Comme prévu, le programme renvoie 'Francfort' en sortie. Maintenant, changeons 'global' en 'nonlocal' et voyons ce qui se passe :

Programme:

def fonction() :

langue non locale

imprimer (langue)

langue = "allemand"

fonction()

Sortir:

Fichier "<ipython-input-9-97bb311dfb80>", ligne 2

langue non locale

^

Erreur de syntaxe : aucune liaison pour la 'langue' non locale trouvée

Comme vous pouvez le voir, le programme ci-dessus génère une erreur de syntaxe. Nous pouvons comprendre à partir de là que les affectations non locales ne peuvent être effectuées qu'à partir de la définition des fonctions imbriquées. Les variables non locales doivent être définies dans la portée de la fonction, et si ce n'est pas le cas, elle ne peut pas non plus trouver sa définition dans la portée imbriquée. Maintenant, consultez le programme suivant :

Programme:

def fonction() :

langue = "Anglais"

def fonction1() :

langue non locale

langue = "allemand"

print("Avant d'appeler fonc1 : " + langue)

print("Appeler la fonction1 maintenant :")

fonction1()

print("Après avoir appelé func1 : " + langue)

langue = "espagnol"

fonction()

print(“'langue' dans main: ” + langue)

Sortir:

Avant d'appeler func1 : anglais

Appel de func1 maintenant :

Après avoir appelé func1 : allemand

'langue' en principal : espagnol

Le programme ci-dessus fonctionne car la variable 'langue' a été définie avant d'appeler la fonction func1(). S'il n'est pas défini, nous obtiendrons une erreur comme ci-dessous :

Programme:

def fonction() :

#langue = "Anglais"

def fonction1() :

langue non locale

langue = "allemand"

print("Avant d'appeler fonc1 : " + langue)

print("Appeler la fonction1 maintenant :")

fonction1()

print("Après avoir appelé func1 : " + langue)

langue = "espagnol"

fonction()

print(“'langue' dans main: ” + langue)

Sortir:

Fichier "<ipython-input-11-5417be93b6a6>", ligne 4

langue non locale

^

Erreur de syntaxe : aucune liaison pour la 'langue' non locale trouvée

Cependant, le programme fonctionnera très bien si nous remplaçons nonlocal par global :

Programme:

def fonction() :

#langue = "Anglais"

def fonction1() :

langue mondiale

langue = "allemand"

print("Avant d'appeler func1` : " + langue)

print("Appeler la fonction1 maintenant :")

fonction1()

print("Après avoir appelé func1 : " + langue)

langue = "espagnol"

fonction()

print(“'langue' dans main: ” + langue)

Sortir:

Avant d'appeler func1 : anglais

Appel de func1 maintenant :

Après avoir appelé func1 : allemand

'langue' en principal : allemand

Si vous remarquez, la valeur de la variable globale (langue) est également modifiée dans le programme ci-dessus ! C'est le pouvoir que les variables non locales apportent avec elles !

En conclusion

Dans cet article, nous avons discuté des variables locales, globales et non locales en Python, ainsi que des différents cas d'utilisation et des erreurs possibles que vous devez rechercher. Avec ces connaissances à vos côtés, vous pouvez aller de l'avant et commencer à vous entraîner avec différents types de variables et à remarquer les différences subtiles.

Python est un langage de programmation extrêmement populaire dans le monde entier, en particulier lorsqu'il s'agit de résoudre des problèmes et des défis liés aux données. Chez upGrad, nous avons une base d'apprenants dans plus de 85 pays, avec plus de 40 000 apprenants rémunérés dans le monde, et nos programmes ont touché plus de 500 000 professionnels en activité. Nos cours en science des données et en apprentissage automatique ont été conçus pour aider les étudiants motivés de tous horizons à démarrer leur voyage et à exceller dans le domaine de la science des données. Notre assistance de carrière à 360 degrés garantit qu'une fois que vous êtes inscrit chez nous, votre carrière ne fait que progresser. Contactez-nous dès aujourd'hui et découvrez la puissance de l'apprentissage par les pairs et du réseautage mondial !

Quels sont les types de variables en Python ?

En fonction de leur portée, les variables en Python sont soit locales, globales ou non locales.

Les variables globales en Python sont-elles accessibles depuis une fonction ?

Oui, les variables globales sont accessibles depuis une fonction en Python.

Quelle est la différence entre les variables locales et globales ?

Les variables globales ont le programme entier comme portée, tandis que les variables locales n'ont que la fonction dans laquelle elles sont définies comme portée.