【Julia】Julia のローカルスコープ
Julia のローカルスコープに一度ハマったので、まとめておきます。
ローカルスコープ?
変数には、その変数を参照可能なコード上の範囲があり、グローバルスコープとローカルスコープがあるというのを抑えておけばいいでしょう。グローバルスコープを持つ変数は、グローバル変数で、ローカルスコープを持つ変数はローカル変数と呼びます。
ローカル変数は、ローカルスコープの外からその変数を参照出来ないという決まりがあったりまします。
恥ずかしながら、Python を主に使用していたときは、この辺のスコープについてあまり意識して書いていませんでした。例えば、for 文使って以下のように for 文内で変数を定義したりしていました。
>>> for i in range(1,10):
... if i == 1:
... x = 1
... else:
... x += 1
...
>>> print(x)
9
幸い、Python であればこの書き方でも問題なく for 文内で定義した変数が、for 文外でも参照できていました。
しかし、Julia ではこれが出来ずに失敗しました。 Julia では、for 文内はローカルスコープとなるので、for 文の外に出ると for 文内で定義した変数の値は使用できません。例えば以下のようになります。
function main()
for _ in 1:10
if !@isdefined(x)
x = 1
else
x += 1
end
end
return x
end
julia> print(main())
ERROR: UndefVarError: `x` not defined
Stacktrace:
[1] main()
@ Main ./REPL[2]:9
[2] top-level scope
@ REPL[3]:1
for 文の外で変数 x の値が print 出来ずに失敗です。
Julia において、ローカルスコープ内で変数をいじるには?
基本的には、ローカルスコープの前に変数を定義したあとに、ローカルスコープ内で値を処理するのがよいと思います。
function main()
x = 0
for _ in 1:10
x += 1
end
return x
end
print(main())
julia> 10
上記のように、ローカルスコープとなる for 文の前に、変数 x を定義しておけば、ローカルスコープ内でその変数の値をいじれます。
注意:グローバル変数はローカルスコープ内では変更ができません。つまり、上記の例では、グローバルスコープである function の外で定義した変数はローカルスコープ内では変更はできず、グローバル変数の値のみが返り値になります。
x = 0
function main()
for _ in 1:10
if !@isdefined(x)
x = 1
else
x += 1
end
end
return x
end
julia> print(main())
0
当たり前といえば当たり前ですね。
まとめ
今回は、Julia におけるローカルスコープとグルーバルスコープについて軽く触れました。for 文で値を定義したはずなのに、所望の値が取り出せないなど困ったら思い出してみてください。