web-dev-qa-db-fra.com

Variables globales/locales Python

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)
10
JJ Beck

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.

9
Rohit Jain

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.

6
Andrew Clark

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)
0
TechnoTech

Vous pouvez lire un global sans le déclarer global. Mais pour écrire un global, vous devez le déclarer global.

0
user1277476
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.

0