2015-04-21 8 views
0

Tout ce que je veux, c'est attribuer une valeur initiale à la variable 'extra_devices' et si l'utilisateur spécifie une valeur à cette variable à l'exécution, la valeur par défaut est remplacée par la valeur spécifiée par l'utilisateur. J'ajoute un extrait de code minimal pour montrer ce que je fais. Lors de l'exécution de ce programme, si je ne spécifie pas 'extra_devices', le programme ne s'exécute pas en disant 'UnboundLocalError: variable locale' extra_devices 'référencé avant l'affectation', mais je ne comprends pas la raison pour laquelle j'ai déjà affecté le valeur à cela. Cependant, le programme fonctionne correctement si je spécifie 'extra_devices' à l'exécution. Quelqu'un at-il un raisonnement pour ce comportement? Notez que la variable 'abc' s'imprime bien dans main().Accéder à la variable globale

#/usr/bin/python 
    import argparse 
    extra_devices=10 
    abc = 1 
    def main(): 

     parser = argparse.ArgumentParser(description='') 
     parser.add_argument('-extra_devices','--extra_devices',help='extra_devices',required=False) 
     args = parser.parse_args() 
     if args.extra_devices is not None: extra_devices = args.extra_devices 
     print "abc="+str(abc) 

     print "extra_devices = "+str(extra_devices) 

    if __name__ == '__main__': 
     main() 

Répondre

2

Ajouter une ligne dans la fonction:

global extra_devices 

Ensuite, vous pouvez écrire à la variable globale dans la fonction. La raison en est que vous pouvez changer cette variable dans la fonction, et l'interprète la définira comme une variable locale au lieu de la variable globale pour protéger la variable globale, sauf que vous affectez cette variable est une variable globale.

Mise à jour:

Ajouter la raison.

+3

Je suggérerais "écrire à" plutôt que "accès", mais oui. –

+0

Non. Mais je suis capable d'accéder à d'autres variables. Le problème est dû à si args.extra_devices n'est pas None: extra_devices = args.extra_devices. Si je supprime cette ligne, cela fonctionne très bien. – Pretty

+0

@Pretty, avez-vous réellement essayé la suggestion donnée ici avant de commenter? –