Compte tenu du code suivant:
a = {}
def foo():
a['bar'] = 0
foo()
4 Réponses :
La question est une question de mise à jour.
Vous ne pouvez pas mettre à jour intéressant, Python génère un code légèrement optimisé pour ce type de relevés. Il utilise une instruction "LOAD_FAST". P> 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> a = A + 1 code> échoue également. 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
La différence est que dans le premier exemple que vous attribuez à Dans le deuxième exemple, vous ne mourez pas d'affectation à Ceci est couvert dans le Documentation . P>
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. p>
blockQuote> a code> qui crée un nouveau nom local A code> qui masque le global A code>. p>
A code> de sorte que le global A code> est utilisé. p>
Je me demande pourquoi ils ont décidé de la décrire comme un "bizarre spécial"? Contraste avec JavaScript où a = 1 code> 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 code>
A + = 1 code> est équivalent à A = A + 1 code>. En attribuant à la variable A code>, il est rendu local. La valeur que vous essayez d'assigner A + 1 code> échoue car A code> n'a pas encore été lié. P>
C'est un très em> Python Common Gotcha: Si vous attribuez à une variable à l'intérieur d'une fonction (comme vous le faites, avec Essayez d'utiliser sur votre deuxième exemple, vous n'abandonnez pas la variable + = code>), 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 code> (à droite de l'expression) avant d'y attribuer. p>
global A code> au début de votre fonction (mais méfiez-vous que vous écraserez la valeur globale globale une valeur code>). p>
A code>, mais uniquement à l'un de ses éléments. Donc, le dict global A code> est utilisé. P>