Portée des variables

6.3 Portée des variables

Objectifs d'apprentissage

À la fin de cette section, vous devriez être en mesure de :

  • Identifier la portée des variables d'un programme.
  • Discuter de l'impact de la portée d'une variable.

Portée globale

La portée (scope) d'une variable est la partie d'un programme dans laquelle cette variable est accessible. Une variable créée en dehors d'une fonction a une portée globale (global scope) et est accessible partout dans le programme. Un programme Python commence dans la portée globale, et cette portée globale persiste pendant toute l'exécution du programme.

Faites le point

Variables globales dans un programme avec une fonction

Concepts en pratique

Variables globales

1.
Quelles variables sont globales ?
num = float(input())
num_sq = num * num
print(num, "squared is", num_sq)
  1. num uniquement
  2. num_sq uniquement
  3. num et num_sq
2.
Quelles variables ont une portée globale ?
def print_square():
  num_sq = num * num
  print(num, "squared is", num_sq)

num = float(input())
print_square()
  1. num uniquement
  2. num_sq uniquement
  3. num et num_sq
3.
Quelles fonctions peuvent accéder à num ?
def print_double():
  num_d = num * 2
  print(num, "doubled is", num_d)

def print_square():
  num_sq = num * num
  print(num, "squared is", num_sq)

num = float(input())
print_double()
print_square()
  1. print_double()
  2. print_square()
  3. print_double() et print_square()

Portée locale

Une variable créée à l'intérieur d'une fonction a une portée locale (local scope) et n'existe qu'au sein de cette fonction. Une variable locale n'est pas accessible en dehors de la fonction dans laquelle elle a été créée. Une fois l'exécution d'une fonction terminée, ses variables locales cessent d'exister.

Faites le point

Variables globales et locales dans un programme avec une fonction

Concepts en pratique

Variables locales

4.
Quelles variables sont locales ?
def print_time():
  out_str = "Time is " + str(hour) + ":" + str(min)
  print(out_str)

hour = int(input())
min = int(input())
print_time()
  1. hour et min
  2. out_str
  3. hour, min et out_str
5.
Quelles variables sont locales ?
def print_greeting():
  print(out_str)

hour = int(input())
min = int(input())
if hour < 12:
  out_str = "Good morning"
else:
  out_str = "Good day"
print_greeting()
  1. hour et min
  2. out_str
  3. aucune
6.
Quelles fonctions accèdent directement à out_str ?
def print_greeting():
  print("Good day,")
  print_time()

def print_time():
  out_str = "Time is " + str(hour) + ":" + str(min)
  print(out_str)

hour = int(input())
min = int(input())
print_greeting()
  1. print_greeting()
  2. print_time()
  3. print_greeting() et print_time()

Utiliser conjointement des variables locales et globales

Python permet aux variables globales et locales de porter le même nom, ce qui peut entraîner des comportements inattendus du programme. Une fonction traite toute variable modifiée en son sein comme une variable locale, sauf indication contraire. Pour modifier une variable globale à l'intérieur d'une fonction, la variable doit être déclarée avec le mot-clé global.

Faites le point

Modification de variables globales dans un programme avec une fonction

Concepts en pratique

Utilisation conjointe de variables locales et globales

Considérez les variantes suivantes du programme d'exemple avec la valeur d'entrée 9.

7.
Quelle est la sortie ?
def update_hour():
  tmp = hour
  if is_dst:
    tmp += 1
  else:
    tmp -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", hour)
  1. New hour: 9
  2. New hour: 10
  3. Error
8.
Quelle est la sortie ?
def update_hour():
  new_hour = hour
  if is_dst:
    new_hour += 1
  else:
    new_hour -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", new_hour)
  1. New hour: 9
  2. New hour: 10
  3. Error
9.
Quelle est la sortie ?
def update_hour():
  global new_hour
  new_hour = hour
  if is_dst:
    new_hour += 1
  else:
    new_hour -= 1

is_dst = True
hour = int(input("Enter hour: "))
update_hour()
print("New hour:", new_hour)
  1. New hour: 9
  2. New hour: 10
  3. Error

Avantages de la limitation de la portée

Un programmeur pourrait se demander : « Pourquoi ne pas simplement faire de toutes les variables des variables globales pour éviter les erreurs d'accès ? » Rendre chaque variable globale peut rendre un programme désordonné. Par exemple, un programmeur qui débogue un grand programme découvre qu'une variable possède une valeur incorrecte. Si l'ensemble du programme peut modifier la variable, le bogue peut alors se trouver n'importe où dans ce grand programme. Limiter la portée d'une variable au strict nécessaire et restreindre l'utilisation des variables globales rend un programme plus facile à déboguer, à maintenir et à mettre à jour.

À vous d'essayer

Lancement d'un jeu battle royale

Écrivez un programme qui lit un mode de jeu sélectionné et appelle l'une des deux fonctions pour lancer le jeu. Si l'entrée est "br", appelez battle_royale(). Sinon, appelez practice().

battle_royale() :

  • Lit le nombre de joueurs.
  • Calcule le nombre de coéquipiers encore nécessaires. Une équipe complète compte 3 joueurs.
  • Appelle la fonction find_teammates() avec le nombre calculé.
  • Affiche "Match starting . . .".

practice() :

  • Lit une chaîne de caractères représentant la carte souhaitée.
  • Affiche "Launching practice on [desired map]".

Remarque : find_teammates() est fournie et n'a pas besoin d'être modifiée.

Pour l'entrée donnée :

    br
    1

La sortie est :

    Finding 2 players...
    Match starting...

Pour l'entrée donnée :

    p
    Queen's Canyon

La sortie est :

    Launching practice on Queen's Canyon