web-dev-qa-db-fra.com

Portée des variables dans Julia

Lorsque j'ai exécuté le code Julia ci-dessous, une erreur s'est produite: UndefVarError: globalValue not defined.

Je pensais que le globalValue est une variable globale, mais ce n'est pas le cas. Ainsi, si j'ajoute la commande "global globalValue" à l'intérieur de la boucle for, mon code fonctionnera. Alors, quelqu'un pourrait-il y jeter un coup d'œil pour me faire savoir ce qui s'est passé? Merci d'avance!

globalValue = 1.0;
tempValue   = 0.1;
for ii = 1:10
    # global globalValue; if I add this command, my code will work
    tempValue = 5.0; ## I have a function to update "tempValue"
    if globalValue < tempValue
        globalValue = tempValue;
    end
end
9
nhavt

Il semble que vous soyez sur Julia> = 0,7, où les règles de portée ont changé.

Pour faire court, dans une portée locale, comme votre boucle for, les variables globales ne sont héritées que pour la lecture mais pas pour l'écriture. Il y a deux façons de contourner cela:

  • mettez un global explicite devant le devoir (ce que vous avez compris vous-même)
  • envelopper tout dans une "portée locale globale" comme let ... end block (globalValue n'est plus vraiment une variable globale)

Dans votre cas, la deuxième option ressemblerait à

let
globalValue = 1.0;
tempValue   = 0.1;
for ii = 1:10
    tempValue = 5.0;## I have a function to update "tempValue"
    if globalValue < tempValue
        globalValue = tempValue;
    end
end
end

Vous pouvez trouver plus d'informations ici:

Bien que cela me dérange un peu, il y a de bonnes raisons pour lesquelles le changement a été effectué. De plus, on devrait essayer de toute façon d'éviter de changer les globaux. Permettez-moi de citer le manuel ici (voir le lien ci-dessus):

Éviter de changer la valeur des variables globales est considéré par beaucoup comme une meilleure pratique de programmation. Une des raisons à cela est que le changement à distance de l'état des variables globales dans d'autres modules doit être fait avec soin car cela rend difficile le raisonnement du comportement local du programme. C'est pourquoi les blocs de portée qui introduisent la portée locale nécessitent que le mot clé global déclare l'intention de modifier une variable globale.

15
crstnbr