2017-05-17 2 views
2

J'ai donc été curieux. Je suis tellement nouveau à Python. Je codifie depuis plus d'un an environ, mais quelque chose que j'ai couvert mais que je n'ai pas totalement compris était la stigmatisation selon laquelle «les variables globales sont mauvaises». Cela dit, j'étais débutant et je ne comprenais rien aux explications en ligne sur les raisons pour lesquelles je devrais éviter (ou faire attention) aux variables globales. J'ai juste pris tout ce que tout le monde a dit à cœur, et fait l'hypothèse que les variables globales sont simplement des monstres sinistres qui rôdent mon code pendant l'exécution et mangent toutes mes données.Python: Utilisation des éléments de liste à la place des variables globales

Alors j'ai commencé à faire ce qui suit:

>>> SomeVar = [0]  # To avoid the 'global' keyword, I'll just make a single list item. 
>>> 
>>> def increment():  # Hey look, it's practically global! 
>>>  SomeVar[0] += 1 
>>> 
>>> increment() 
>>> increment() 
>>> 
>>> SomeVar 
[2] 

Après un certain temps, j'ai enfin la connaissance et l'expérience pour faire des recherches sur la question réelle, un je commence à avoir l'impression que je mai ont manqué le point. Je sais que les globals occupent un espace de noms, peuvent présenter des problèmes de multithreading, et trop d'entre eux et/ou trop de fonctions qui y accèdent à la fois peuvent être difficiles à suivre, mais il y en a assez que je ne comprends pas. voulait demander;

Ma variable list-global-aversion aide-t-elle réellement avec le des problèmes que les variables globales peuvent présenter, ou ai-je complètement manqué le point? Je peux voir pourquoi cela ne ferait pas du bien avec les problèmes mentionnés ci-dessus, (multithread, code spaghetti) mais ... aide-t-il du tout?

Merci d'avance !!

+0

'SomeVar' * est une variable globale. La seule chose que vous avez évitée est d'utiliser le mot clé 'global'. – timgeb

+0

Dans votre exemple, si vous tapez 'globals()', vous constaterez que SomeVar, qu'il s'agisse d'une liste ou d'un nombre, apparaît dans le dictionnaire global. :-) –

Répondre

3

Oui, vous avez manqué le point. Ce que vous avez créé est toujours une variable globale; tout ce que vous avez fait était de travailler autour du mot-clé.

Lorsque ceci se développe en un programme complet, l'initialisation de Somevar est susceptible d'être largement séparée de son utilisation. Vous avez laissé votre fonction dépendante d'une variable externe d'emplacement et de provenance inconnus. à la place, essayez ceci:

def increment(var):  # Hey look, it's properly local! 
    return var + 1 

somevar = 0 
somevar = increment(somevar) 
somevar = increment(somevar)