web-dev-qa-db-ja.com

Juliaの変数のスコープ

以下のJuliaコードを実行すると、エラーが発生しました:UndefVarError: globalValue not defined

GlobalValueはグローバル変数だと思いましたが、そうではありません。したがって、forループ内に「global globalValue」というコマンドを追加すると、コードが機能します。だから、誰かがそれを見て私に何が起こったのか教えてくれませんか?前もって感謝します!

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

スコープ規則が変更されたJulia> = 0.7にいるようです。

簡単に言えば、forループなどのローカルスコープでは、グローバル変数は読み取り専用で継承され、書き込み専用ではありません。それを回避する方法は2つあります。

  • 割り当ての前に明示的なglobalを置きます(自分で考えたもの)
  • let ... endブロックのような「グローバルローカルスコープ」ですべてをラップします(globalValueは実際にはグローバル変数ではありません)

あなたの場合、2番目のオプションは次のようになります

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

あなたはここでより多くの情報を見つけることができます:

私はこれが少し迷惑であると思いますが、変更が行われた理由はいくつかあります。また、onはとにかくグローバルを変更しないようにする必要があります。ここでマニュアルを引用させてください(上のリンクを参照):

グローバル変数の値を変更しないことは、プログラミングのベストプラクティスであると多くの人が考えています。この理由の1つは、他のモジュールのグローバル変数の状態をリモートで変更すると、プログラムのローカル動作が推測しにくくなるため、注意して行う必要があるためです。これが、ローカルスコープを導入するスコープブロックがグローバル変数を変更する意図を宣言するためにglobalキーワードを必要とする理由です。

15
crstnbr