170 votes

Quelle est la différence entre globals(), locals(), et vars()?

Quelle est la différence entre globals(), locals(), et vars()? Que font-ils de retour? Mise à jour des résultats utiles?

203voto

Ethan Furman Points 12683

Chacun de ces retour d'un dictionnaire:

  • globals() toujours retourne le dictionnaire du module de l'espace de noms
  • locals() toujours retourne un dictionnaire de l' actuel espace de noms
  • vars() renvoie un dictionnaire de l'espace de noms courant (si la fonction est appelée sans argument) ou le dictionnaire de l'argument.

locals et vars pourrait utiliser un peu plus d'explication. si locals() est appelée à l'intérieur d'une fonction on construit un dictionnaire de la fonction de l'espace de noms à partir de ce moment, et le renvoie -- tout autre nom affectations sont pas reflétées dans le retour de dictionnaire, et toutes les affectations pour le dictionnaire ne sont pas reflétées dans l'espace de noms local:

def test():
    a = 1
    b = 2
    huh = locals()
    c = 3
    print(huh)
    huh['d'] = 4
    print(d)

nous donne:

{'a': 1, 'b': 2}
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    test()
  File "test.py", line 26, in test
    print(d)
NameError: global name 'd' is not defined

Deux remarques:

  1. Ce comportement est Disponible spécifiques -- autres Pythons peuvent autoriser les mises à jour pour le faire revenir à l'espace de noms local
  2. En Disponible 2.x il est possible de faire ce travail en mettant un exec "pass" ligne dans la fonction.

Si locals() est appelé en dehors d'une fonction, il retourne la vraie dictionnaire de l'espace de noms courant. D'autres changements à l'espace de noms sont reflétées dans le dictionnaire, les changements et le dictionnaire sont reflétées dans l'espace de noms:

class Test(object):
    a = 'one'
    b = 'two'
    huh = locals()
    c = 'three'
    huh['d'] = 'four'
    print huh

nous donne:

{
  'a': 'one',
  'b': 'two',
  'c': 'three',
  'd': 'four',
  'huh': {...},
  '__module__': '__main__',
}

Jusqu'à présent, tout ce que j'ai dit à propos de locals() est également vrai pour l' vars()... voici la différence: vars() accepte un seul objet comme argument, et si vous lui donner un objet qu'elle renvoie l' __dict__ de cet objet. Si cet objet était pas une fonction de l' __dict__ retournée est celle de l'objet de l'espace de noms:

class Test(object):
    a = 'one'
    b = 'two'
    def frobber(self):
        print self.c
t = Test()
huh = vars(t)
huh['c'] = 'three'
t.frobber()

ce qui nous donne:

three

Si l'objet a une fonction, vous obtenez toujours ses __dict__, mais à moins que vous êtes en train de faire plaisir et de choses intéressantes c'est probablement pas très utile:

def test():
    a = 1
    b = 2
    print test.c
huh = vars(test)       # these two lines are the same as 'test.c = 3'
huh['c'] = 3
test()

ce qui nous donne:

3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X