2010-02-18 7 views
4

Le code suivant:Accès à une variable dans une fonction Doublement en Python Nested

x = 0 
print "Initialization: ", x 
def f1(): 
    x = 1 
    print "In f1 before f2:", x 
    def f2(): 
     global x 
     x = 2 
     print "In f2:   ", x 
    f2() 
    print "In f1 after f2: ", x 
f1() 
print "Final:   ", x 

impressions:

Initialization: 0 
In f1 before f2: 1 
In f2:   2 
In f1 after f2: 1 
Final:   2 

est-il un moyen pour f2 pour accéder aux variables de f1?

+2

C'est une chose épouvantable. Pourquoi essayez-vous de faire cela? Pourquoi ne pas simplement faire de 'f1' un objet appelable et partager correctement les variables d'instance? –

+0

Je suis d'accord, c'est très affreux, mais je me demandais si c'était possible. J'espère que personne ne mettrait quelque chose comme ça dans la nature. – kzh

Répondre

5

Vous pouvez accéder aux variables, le problème est l'affectation. En Python 2, il n'y a aucun moyen de relier x à une nouvelle valeur. Voir PEP 227 (portées imbriquées) pour plus d'informations à ce sujet. En Python 3, vous pouvez utiliser le nouveau mot-clé nonlocal au lieu de global. Voir PEP 3104.

0

supprimer global déclaration:

>>> x 
0 
>>> def f1(): 
    x = 1 
    print(x) 
    def f2(): 
     print(x) 
    f2() 
    print(x) 


>>> f1() 
1 
1 
1 

si vous voulez changement variables x de f1 alors vous devez utiliser la déclaration global dans chaque fonction.

+0

Cela ne vous permettra pas d'assigner à x à partir de f2. – interjay

+0

qui a été réparé, interjay. Cependant, d'après la question, il n'est pas clair que OP veut assigner 'x'. Il dit * accès *. – SilentGhost

5

En Python 3, vous pouvez définir x comme nonlocal dans f2.

En Python 2, vous ne pouvez pas affecter directement à x dans f2 de f1. Cependant, vous pouvez lire sa valeur et accéder à ses membres. Donc, cela pourrait être une solution de contournement:

def f1(): 
    x = [1] 
    def f2(): 
     x[0] = 2 
    f2() 
    print x[0] 
f1()