2010-07-29 10 views
1

Donc, je suis confus. J'ai un module contenant une fonction que j'utilise dans un autre module. Importé comme ceci:Python - Affecter une variable globale à la fonction return nécessite que la fonction soit globale?

from <module> import * 

intérieur de mon module, il existe des fonctions dont le but est de définir des variables globales dans le programme principal.

main.py:

from functions import * 

bar = 20 
print bar 
changeBar() 
print bar 

functions.py:

def changeBarHelper(variable): 
    variable = variable * 2 
    return variable 

def changeBar(): 
    global bar 
    bar = changeBarHelper(bar) 

Maintenant, ceci est une simplification, mais il est le code moins qui donne le même résultat:

Traceback (most recent call last): 
    File "/path/main.py", line 5, in 
     changeBar() 
    File "/path/functions.py", line 7, in changeBar 
    bar = changeBarHelper(bar) 
NameError: global name 'bar' is not defined 
+3

Astuce: Ne pas utiliser des variables globales. Ils sont une idée colossalement mauvaise. C'est un excellent exemple de pourquoi. Ils sont difficiles à utiliser. Donc ne les utilisez pas, –

+0

les variables globales sont mauvaises. l'importation * est le mal. Le mal engendre la confusion. –

Répondre

3

Faire un import * comme vous l'avez fait est un processus à sens unique. Vous avez importé un tas de noms, de la même façon que vous le feriez:

from mymodule import foo, bar, baz, arr, tee, eff, emm 

Ils sont tous simplement affectés à des noms dans la portée globale du module où le import est fait. Ce que cela ne fait pas, c'est connecter les espaces de noms globaux de ces deux modules. global signifie module-global, pas global-to-all-modules. Ainsi, chaque module peut avoir sa propre variable globale fubar, et assigner à un ne l'affectera pas à chaque module.

Si vous voulez accéder à un nom d'un autre module, vous devez l'importer. Donc, dans cet exemple:

def foo(var1, var2): 
    global bar 
    from mainmodule import fubar 
    bar = fubar(var1) 

En faisant l'importation dans la fonction elle-même, vous pouvez éviter les importations circulaires.

0

Eh bien, je ne peux pas commenter l'un des messages ici et cette solution ne fonctionne pas. Je voudrais clarifier cela un peu.

Il y a deux modules ici:

main.py:

from functions import * 

bar = 20 
print bar 
changeBar() 
print bar

functions.py:

def changeBarHelper(variable): 
    variable = variable * 2 
    return variable 

def changeBar(): 
    global bar 
    bar = changeBarHelper(bar)

Maintenant, ceci est une simplification, mais il est le moins code donne le même résultat:

Traceback (most recent call last): 
    File "/path/main.py", line 5, in 
    changeBar() 
    File "/path/functions.py", line 7, in changeBar 
    bar = changeBarHelper(bar) 
NameError: global name 'bar' is not defined

Maintenant, la solution donnée ne fonctionne pas pour moi, et c'est un problème que je voudrais vraiment une solution.

0

def changebar()

doit être:

def changebar (bar)

cette façon lorsque vous appelez changebar (bar) dans main.py

fonctionne functions.py sur la barre variable de la main.py

sooo ...

from functions import * 

bar = 20 
print bar 
bar = changeBar(bar) 
print bar 

def changeBarHelper(variable): 
    variable = variable * 2 
    return variable 

def changeBar(bar): 
    bar = changeBarHelper(bar) 
    return bar 
Questions connexes