Dans Python 3, vous pouvez utiliser l'option nonlocal
déclaration pour accéder à des champs d'application non locaux et non globaux.
Les nonlocal
permet de lier une définition de variable à une variable précédemment créée dans la portée la plus proche. Voici quelques exemples pour illustrer ce phénomène :
def sum_list_items(_list):
total = 0
def do_the_sum(_list):
for i in _list:
total += i
do_the_sum(_list)
return total
sum_list_items([1, 2, 3])
L'exemple ci-dessus échouera avec l'erreur : UnboundLocalError: local variable 'total' referenced before assignment
Utilisation nonlocal
nous pouvons faire fonctionner le code :
def sum_list_items(_list):
total = 0
def do_the_sum(_list):
# Define the total variable as non-local, causing it to bind
# to the nearest non-global variable also called total.
nonlocal total
for i in _list:
total += i
do_the_sum(_list)
return total
sum_list_items([1, 2, 3])
Mais que signifie "le plus proche" ? Voici un autre exemple :
def sum_list_items(_list):
total = 0
def do_the_sum(_list):
# The nonlocal total binds to this variable.
total = 0
def do_core_computations(_list):
# Define the total variable as non-local, causing it to bind
# to the nearest non-global variable also called total.
nonlocal total
for i in _list:
total += i
do_core_computations(_list)
do_the_sum(_list)
return total
sum_list_items([1, 2, 3])
Dans l'exemple ci-dessus, total
se liera à la variable définie à l'intérieur de l'élément do_the_sum
et non la variable externe définie dans la fonction sum_list_items
le code renverra donc 0
. Notez qu'il est toujours possible d'effectuer une double imbrication comme suit : if total
est déclarée nonlocal
en do_the_sum
l'exemple ci-dessus fonctionnerait comme prévu.
def sum_list_items(_list):
# The nonlocal total binds to this variable.
total = 0
def do_the_sum(_list):
def do_core_computations(_list):
# Define the total variable as non-local, causing it to bind
# to the nearest non-global variable also called total.
nonlocal total
for i in _list:
total += i
do_core_computations(_list)
do_the_sum(_list)
return total
sum_list_items([1, 2, 3])
Dans l'exemple ci-dessus, l'assignation non locale remonte deux niveaux avant de localiser l'élément total
qui est locale à sum_list_items
.