全3298文字
PR

 プログラミングを始めようとして挫折した経験がある人は多いだろう。つまずく箇所は人それぞれだと思うが、繰り返し処理、すなわちループが鬼門だという話はよく聞く。条件分岐はすんなり理解できるのに、ループの概念が理解できない人が多いのだという。

 個人的には、現実からの類推のしやすさが関係しているのではないかと思っている。日常生活でも「Aの場合はこうして、Bの場合はこうしよう」と考えることは多い。このため、プログラミングの条件分岐にも抵抗がないのだろう。

 一方、日常生活で繰り返しといえば、普通は全く同じ動作を繰り返すことを指す。ところがプログラミングのループは、値を少しずつ変えながら、その値に対して所定の処理を繰り返すことが多い。日常生活で自然にこうした考え方をするケースはあまりない。このため現実からの類推がうまくいかず、つまずく人が出てくるのではないかと想像している。

 プログラミングでは、条件分岐やループといった制御構文の前に学ぶ初歩の初歩の概念がある。変数だ。変数や代入といった概念自体は学校の数学の授業でも出てくるため、ここでつまずくという話はほとんど聞かない。

 しかし、実はプログラミングでは変数と値はとても混同しやすいものだ。「そんなことはないだろう。変数は値を入れるもので、変数の中に入っているのが値だ。区別はきちんとつく」と思うかもしれない。

 本当にそうだろうか。次のPythonプログラムの実行結果として何が表示されるかを考えてほしい。

a = 1
b = a
a = 2
print(b)

 少しでもプログラミングをしたことがあれば、間違える人はいないだろう。もちろん答えは「1」である。

 しかし、プログラミングを全くしたことのない人の多くは「2」と答えるはずだ。「まずaが1になる。次にbがaと同じになる。次にaが2になる」。こう考えれば、bの値はaと同じ「2」になっていると考えるのが自然だ。

 カギになっているのが「b=a」というコードの解釈だ。プログラミングでは、イコールは「左辺が右辺と同じになる」という意味ではない。「右辺の式を計算し、計算の結果を左辺の変数に代入する」という意味だ。式の計算のことをプログラミングでは「評価」と呼ぶ。

 「b=a」の「a」は単なる変数ではなく、「aという1つの変数からなる式」である。この式を評価すると、aの値である1になる。その1という値がbに代入される。bが受け取るのはあくまで1という値であり、aとの関係ができるわけではない。いくらaの値を変更しても、bの値には影響しないのだ。