6
votes

Résolution de la variable Python

Compte tenu du code suivant:

a = {}
def foo():
  a['bar'] = 0
foo()


0 commentaires

4 Réponses :


1
votes

La question est une question de mise à jour.

Vous ne pouvez pas mettre à jour a code> car il n'est pas une variable dans l'espace de noms local de votre fonction. L'opération d'attribution de mise à jour en place ne parvient pas à mettre à jour A code> en place. P>

intéressant, a = A + 1 code> échoue également. P>

Python génère un code légèrement optimisé pour ce type de relevés. Il utilise une instruction "LOAD_FAST". P>

  2           0 LOAD_CONST               1 (0)
              3 LOAD_GLOBAL              0 (a)
              6 LOAD_CONST               2 ('bar')
              9 STORE_SUBSCR        
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        


0 commentaires

2
votes

La différence est que dans le premier exemple que vous attribuez à a qui crée un nouveau nom local A qui masque le global A .

Dans le deuxième exemple, vous ne mourez pas d'affectation à A de sorte que le global A est utilisé.

Ceci est couvert dans le Documentation .

Un ennemi spécial de Python est que - si aucune déclaration globale n'est en vigueur - les affectations aux noms entrent toujours dans la portée la plus interne.


1 commentaires

Je me demande pourquoi ils ont décidé de la décrire comme un "bizarre spécial"? Contraste avec JavaScript où a = 1 attribue automatiquement à la portée globale! La seule bonne chose à propos de cela est que vous pouvez reconnaître rapidement le code des ordures par les absences de var a = 1



0
votes

A + = 1 est équivalent à A = A + 1 . En attribuant à la variable A , il est rendu local. La valeur que vous essayez d'assigner A + 1 échoue car A n'a pas encore été lié.


0 commentaires

0
votes

C'est un très Python Common Gotcha: Si vous attribuez à une variable à l'intérieur d'une fonction (comme vous le faites, avec + = ), n'importe où du tout (pas nécessairement avant Vous l'utilisez d'une autre manière), cela n'utilise pas le global. Cependant, étant donné que ce que vous faites est efficacement "A = A + 1", vous essayez d'accéder à A (à droite de l'expression) avant d'y attribuer.

Essayez d'utiliser global A au début de votre fonction (mais méfiez-vous que vous écraserez la valeur globale globale une valeur ).

sur votre deuxième exemple, vous n'abandonnez pas la variable A , mais uniquement à l'un de ses éléments. Donc, le dict global A est utilisé.


0 commentaires