Quelle est la différence entre globals()
, locals()
, et vars()
? Que font-ils de retour? Mise à jour des résultats utiles?
Réponse
Trop de publicités?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:
- Ce comportement est Disponible spécifiques -- autres Pythons peuvent autoriser les mises à jour pour le faire revenir à l'espace de noms local
- 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