Pourquoi ce code fonctionne-t-il:
var = 0
def func(num):
print num
var = 1
if num != 0:
func(num-1)
func(10)
mais celui-ci donne l'erreur "variable locale 'var' référencée avant affectation":
var = 0
def func(num):
print num
var = var
if num != 0:
func(num-1)
func(10)
Parce que dans le premier code, vous avez créé une variable locale var
et utilisé sa valeur, alors que dans le second code, vous utilisez la variable locale var
sans la définir.
Donc, si vous voulez faire fonctionner votre 2e fonction, vous devez déclarer: -
global var
dans la fonction avant d'utiliser var
.
def func(num):
print num
var = 1 <-- # You create a local variable
if num != 0:
func(num-1)
Considérant que dans ce code:
def func(num):
print num
var = var <--- # You are using the local variable on RHS without defining it
if num != 0:
func(num-1)
METTRE &AGRAVE; JOUR: -
Cependant, selon le commentaire de @ Tim, vous ne devez pas utiliser de variable global
dans vos fonctions. Définissez plutôt votre variable avant de l’utiliser, pour l’utiliser dans local scope
. En règle générale, vous devriez essayer de limit
la portée de vos variables à local
, et même dans local
namespace limit
la portée des variables locales, car votre code sera ainsi plus facile à comprendre.
Plus vous augmentez la portée de vos variables, plus vous avez de chances de le faire utiliser par la source externe, où il n’est pas nécessaire de l’utiliser.
Si vous avez var = ...
n'importe où dans une fonction, le nom "var" sera traité comme une variable locale pour toute la fonction, quel que soit le lieu de l'affectation. Cela signifie que toutes les occurrences de var
dans votre fonction seront résolues dans l'étendue locale. Par conséquent, le côté droit de var = var
correspond à l'erreur d'attribution précédemment mentionnée car var
n'a pas encore été initialisé dans l'étendue de la fonction.
Dans votre deuxième morceau de code, vous avez créé une variable locale dans RHS et sans la définir, vous l'affectez à la variable LHS var
qui est globale (une variable définie en dehors de la fonction est considérée explicitement comme globale).
Si votre intention est de créer une variable locale à l'intérieur de la fonction et de l'assigner à la valeur de la variable globale, le problème est résolu:
var = 0
def func(num):
print num
func.var = var # func.var is referring the local
# variable var inside the function func
if num != 0:
func(num-1)
func(10)
Vous pouvez lire un global sans le déclarer global. Mais pour écrire un global, vous devez le déclarer global.
def runscan(self):
p = os.popen('LD_PRELOAD=/usr/libv4l/v4l1compat.so zbarcam
/dev/video0','r')
def input(self):
self.entryc.insert(END, code)
que dis-tu de ça? Je souhaite utiliser le code local de la fonction suivante pour insérer le résultat du code à barres dans mon Tkinter entryBox .. Merci.