Ce que je comprends de la lecture de la documentation, c'est que Python a un espace de noms séparé pour les fonctions, et si je veux utiliser une variable globale dans cette fonction, je dois l'utiliser global
.
J'utilise Python 2.7 et j'ai essayé ce petit test
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Il semble que les choses fonctionnent bien même sans global
. J'ai pu accéder à la variable globale sans aucun problème.
Suis-je en train de manquer quelque chose? En outre, ce qui suit provient de la documentation Python:
Les noms répertoriés dans une instruction globale ne doivent pas être définis en tant que paramètres formels ou dans une cible de contrôle de boucle for, une définition de classe, une définition de fonction ou une instruction d'importation.
Bien que les paramètres formels et la définition de classe aient un sens pour moi, je ne suis pas en mesure de comprendre la restriction de la définition de la fonction et de la cible du contrôle de boucle.
def foo(): ...
etfoo = ...
en même temps). Il crée une nouvelle portée pour chaque appel de fonction. (Mais en quoi est-ce différent de tous les autres langages de haut niveau à distance dans le monde?)Réponses:
Le mot
global
- clé n'est utile que pour modifier ou créer des variables globales dans un contexte local, bien que la création de variables globales soit rarement considérée comme une bonne solution.Ce qui précède vous donnera:
Alors que si vous utilisez l'
global
instruction, la variable deviendra disponible "en dehors" de la portée de la fonction, devenant ainsi une variable globale.Ainsi, le code ci-dessus vous donnera:
De plus, en raison de la nature de python, vous pouvez également utiliser
global
pour déclarer des fonctions, des classes ou d'autres objets dans un contexte local. Bien que je le déconseille, car cela provoque des cauchemars si quelque chose se passe mal ou doit être débogué.la source
globals
défini automatiquement dans tous les espaces de noms (heureusement). Comme vous l'avez correctement souligné, un global est lié à un espace de noms dans un module, mais il peut être importé dans un autre module sous la formefrom module import variable
ouimport module.variable
. Dans le premier cas, l'importation rendrait la variable accessible commevariable
sans nécessiter de référence commemodule.
. S'il est considéré comme global dans la portée du module, cela dépendra de l'endroit où il est importé. Voir aussinonlocal
comme un nouveau mot-clé lié à la portée en python 3.Bien que vous puissiez accéder aux variables globales sans le
global
mot - clé, si vous souhaitez les modifier, vous devez utiliser leglobal
mot - clé. Par exemple:Dans votre cas, vous accédez simplement à la liste
sub
.la source
foo = 3
sans travaux globaux, mais foo est à nouveau défini localement dans lablub
portée de la fonction et ne modifie pas la variable foo d'origine. C'était assez déroutant pour moi.C'est la différence entre accéder au nom et le lier dans une portée.
Si vous recherchez simplement une variable pour lire sa valeur, vous avez accès à la portée globale et locale.
Cependant, si vous attribuez à une variable dont le nom n'est pas dans la portée locale, vous liez ce nom dans cette portée (et si ce nom existe également en tant que global, vous le masquerez).
Si vous voulez pouvoir attribuer au nom global, vous devez dire à l'analyseur d'utiliser le nom global plutôt que de lier un nouveau nom local - ce que fait le mot-clé 'global'.
La liaison n'importe où dans un bloc provoque la liaison du nom partout dans ce bloc, ce qui peut entraîner des conséquences assez étranges (par exemple UnboundLocalError apparaissant soudainement dans du code fonctionnant précédemment).
la source
Les autres réponses répondent à votre question. Une autre chose importante à savoir sur les noms en Python est qu'ils sont locaux ou globaux selon la portée.
Considérez ceci, par exemple:
Vous pouvez probablement deviner que l'
value = 0
instruction sera affectée à une variable locale et n'affectera pas la valeur de la même variable déclarée en dehors de ladoit()
fonction. Vous pourriez être plus surpris de découvrir que le code ci-dessus ne fonctionnera pas. L'instructionprint value
à l'intérieur de la fonction produit unUnboundLocalError.
La raison en est que Python a remarqué que, ailleurs dans la fonction, vous attribuez le nom
value
, etvalue
n'est également déclaré nulle partglobal
. Cela en fait une variable locale. Mais lorsque vous essayez de l'imprimer, le nom local n'a pas encore été défini. Dans ce cas, Python ne revient pas à rechercher le nom comme variable globale, comme le font d'autres langages. Essentiellement, vous ne pouvez pas accéder à une variable globale si vous avez défini une variable locale du même nom n'importe où dans la fonction.la source
global
(ounonlocal
dans Python 3.x) remplace ce comportement et vous permet de réaffecter le nom externe.let
sont pas hissées.global
ou cela n'a pas d'importance?L'accès à un nom et l'attribution d'un nom sont différents. Dans votre cas, vous accédez simplement à un nom.
Si vous attribuez à une variable dans une fonction, cette variable est supposée être locale, sauf si vous la déclarez globale. En l'absence de cela, il est supposé être mondial.
la source
global
Exemple:
la source
Toute variable déclarée en dehors d'une fonction est supposée être globale, c'est seulement en les déclarant de l'intérieur des fonctions (sauf les constructeurs) que vous devez spécifier que la variable soit globale.
la source
Ceci est bien expliqué dans la FAQ Python
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
la source
Cela signifie que vous ne devez pas effectuer les opérations suivantes:
la source
Global rend la variable "Global"
Cela fait que «x» agit comme une variable normale en dehors de la fonction. Si vous supprimiez le global, cela donnerait une erreur car il ne peut pas imprimer une variable à l'intérieur d'une fonction.
la source