2011-12-05 1 views
1

OK Je fais du threading, et je suppose que lorsque j'ai commencé à faire du threading, je suppose que vous ne pouvez pas retourner des valeurs comme une définition (c'est la fin de la journée et mon cerveau est sur le point de mourir alors peut-être ce qui est faux et je devrais commencer à retourner pour se débarrasser des variables globales)Variables globales et modules (exemple simple aide) Python

Quoi qu'il en soit j'ai un programme de test pour savoir pourquoi je ne peux pas modularisation mon code

un fichier appelé config .py

a_variable=0 

un fichier appelé test_for_sean.p y

from config import * 
def blah(): 
    global a_variable 
    a_variable=14 
    return 0 

un fichier appelé main.py

from config import * 
from test_for_sean import * 
print a_variable #this prints correctly 
blah() 
print a_variable #this is still printing 0.... 

quelqu'un me lier à quelque chose si je ne me tue pas

+0

Je ne recommande pas de faire un '' '' import * '' '' '' '. Peut-être '' 'importer test_for_sean en tant que tfs'''. Cela provoquera toutes sortes de problèmes - comme la façon dont config.py est exécuté deux fois et remplit l'espace de noms global des deux scripts dans lesquels il est importé. – FakeRainBrigand

+0

@FakeRainBrigand Je regardais ce http://www.etsimo.uniovi.es/python/infogami-faq/programming/how-do-i-share-global-variables-across-modules/ est-ce vraiment mal? –

+0

Mon erreur. J'ai testé avec un '' 'print''' dans config.py et il ne s'exécute qu'une seule fois. – FakeRainBrigand

Répondre

3

Essayez ces changements,

config.py,

a_variable = 0 

tfs.py (était te st_for_sean),

import config 

def blah(): 
    config.a_variable = 14 
    return 0 

main.py,

import tfs, config 

print config.a_variable 
tfs.blah() 
print config.a_variable 

Nous importons encore tout de config, mais sont des variables 'globales' restent dans leurs propres modules. De cette façon, nous pouvons avoir des variables globales mais toujours laisser main.py définir ses propres a_variable s'il le faut.

+0

J'ai corrigé mon code ci-dessus (grâce au lien de Sean). Maintenant, cela fonctionne sans globals. Juste '' 'import config''' où vous voulez l'utiliser. – FakeRainBrigand

+0

qui fonctionne, laissez-moi voir si je peux l'agrandir, j'aime la meilleure modularisation! Merci l'homme, je suis triste, je n'ai qu'un seul upvote à donner. –

4

Lorsque vous importez des variables d'un module, les noms sont importés dans l'espace de noms du module en cours, ils ne sont pas partagés entre les deux modules. Le mot-clé global ne vous permet pas de partager des noms entre les modules, il vous permet uniquement d'attribuer un nom qui se trouve dans la portée globale de ce module.

Pour partager réellement les variables entre les modules dont vous avez besoin pour accéder à la variable par son module:

un fichier appelé config.py

a_variable=0 

un fichier appelé test_for_sean.py

import config 
def blah(): 
    config.a_variable=14 
    return 0 

un fichier appelé main.py

import config 
from test_for_sean import blah 
print config.a_variable # prints 0 
blah() 
print config.a_variable # prints 14 
1

Il existe une analogie avec un système de fichiers. Ce n'est pas une analogie parfaite, mais cela aide à comprendre le problème rapidement.

Les modules sont comme des répertoires contenant des fichiers et ces fichiers représentent des variables et d'autres objets. Dans les modules, vous utilisez des chemins relatifs. Notez simplement les chemins absolus et l'image sera claire.

Votre point de départ est:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 

A. Si vous faites cela en module2:

import a_variable from module1 

Vous faites une copie de la a_variable variable:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/a_variable 

En Dans ce cas, lorsque les variables ne sont pas modifiables, elles seront désynchronisées lors de la première modification.

B. Mais quand vous faites ceci:

import module1 

Vous créez une copie du chemin menant à la variable: module1.a_variable

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/module1 -> ../module1 

Le résultat est la même variable dans les deux modules .

Questions connexes