0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初学者向け】関数の中でグローバル変数を書き換える時の典型的な間違い

Posted at

典型的なグローバル変数とローカル変数の間違いの例の紹介

プログラミング初学者向けに、グローバル変数に関する典型的な間違いの例を共有させていただきます。

具体的にはグローバル変数を関数の中で書き換える際の典型的な間違いについてです。

関数の中でグローバル変数を書き換える際のエラー

  • 関数の中でグローバル変数を書き換えるときは、関数の中でglobal変数であることを明示しないとエラーになる。

以下の例は、エラーとなる。

# global変数
c = 0

function dosomething(N::Integer)
    c += N
end

以下は正しく動く例

# global変数
c = 0

function dosomething(N::Integer)
    global c #関数の中から外で定義された変数を見えるようにする。
    c += N
end

dosomething(3)
@show c
dosomething(5)
@show c

しかし、この場合グローバル変数の値が書き変わってしまうのでcを今後使う際は、注意が必要である。

関数の中でグローバル変数を単に参照するコードの場合

ただ単にグローバル変数を参照しているだけの場合は、グローバル変数を書き換えないため動く。

# OK
d = 1
function incremet(N::Integer)
    return N + d
end

しかしながら、グローバル変数はなるべく使わない方が良いとされる。もし使うとしてもconstをつけると良いだろう。なぜならコンストつけると絶対値は変わらないからである。それによって意図せず参照している値が変わっていることによる間違いを防ぐことができる。

コンストを使う場合、

const d = 1
function incremet(N::Integer)
    return N + d
end

次にグローバル変数sの値を変える場合を考える。 関数の中でconstを使ったグローバル変数の値を変えると怒られるから、一旦別の変数にコピーをする。その場合、元々のグローバル変数はずっと変わらない。

const s = 0
function dosomething(N::Integer)
    q = s
    for i in 1:N
        q += incremet(i)
    end
    return q
end

本記事の紹介はここまでです。
最後に、そもそもグローバル変数を使わない場合のコードは、

function dosomething(M)
    s = 0
    for i in 1:M
        s += incremet(i)
    end
    return s
end

まとめ

プログラミング初学者向けに、グローバル変数に関する典型的な間違いを共有しました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?