Scope of variables in Julia

前端 未结 1 1241
夕颜
夕颜 2020-12-03 11:13

When I ran the Julia code below, there was an error: UndefVarError: globalValue not defined.

I thought that the globalValue is a global variable, but it

相关标签:
1条回答
  • 2020-12-03 11:56

    It seems you are on Julia >= 0.7, where the scoping rules have changed.

    Long story short, in a local scope, such as your for-loop, global variables are only inherited for reading but not for writing. There are two ways around it:

    • put an explicit global in front of the assignment (what you figured out yourself)
    • wrap everything in a "global local scope" like let ... end block (globalValue isn't really a global variable anymore)

    In your case, the second option would look like

    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
    

    You can find more information here:

    • https://discourse.julialang.org/t/repl-and-for-loops-scope-behavior-change/ (in particular this post by Stefan, who is one of the authors of Julia
    • https://docs.julialang.org/en/stable/manual/variables-and-scoping/#scope-of-variables-1

    Although I find this a bit annoying myself, there are good reasons for why the change has been made. Also, on should try to avoid changing globals anyway. Let me quote the manual here (see link above):

    Avoiding changing the value of global variables is considered by many to be a programming best-practice. One reason for this is that remotely changing the state of global variables in other modules should be done with care as it makes the local behavior of the program hard to reason about. This is why the scope blocks that introduce local scope require the global keyword to declare the intent to modify a global variable.

    0 讨论(0)
提交回复
热议问题