< 前の記事 | Web講座TOP | 次の記事 >

初心者向け Pythonパイソン講座 - 第3回「変数へんすうの使い方」

投稿者:3G 大毛


前回は整数せいすうや小数とそれらの演算えんざんについて学びました。・・・おめでとうございます!あなたはもうPythonを高性能な電卓でんたくとして使いこなせるようになりました。しかし、Pythonの力はそれだけではありません。Pythonを電卓からプログラミングへ進化させるには変数へんすうを使う必要があります。


Pythonの変数は大ざっぱに言うと、データの保管ほかん場所につける名札なふだです。名札の名前を呼べば目的のデータを取り出すことができるという仕組みです。名札は途中で別のデータの場所に付けえることもできますし、同じ場所に2つ以上の名札を付けることもできます。



 ◆ 「変数はデータを入れる『箱』」と教わった皆さんへ ◆ (※クリックして展開てんかいして下さい
「Pythonの変数は『箱』ではない?」

さきほどPythonの変数は名札であるといいました。実は、Pythonの変数を「データの入った箱」と考えると間違ってしまうことがあります。Pythonでは異なる変数が同じデータを指し示すことがあるからです。

Pythonの変数を箱と考えると、例えば次のようなことが起こります:
「ここに箱Aと箱Bがあります。両方とも空です。いま箱Aにボールを1つ入れました。すると箱Bにもボールが1つ入っています。」

何やらおかしいですね。それでは変数を名札と考えるとどうでしょうか?:
「ここに名札Aと名札Bがあります。両方とも空箱に貼られています。いまAの箱にボールを1つ入れました。するとBの箱にもボールが1つ入っています。」

両方の名札が同じ箱に貼られていることに気づけば、まったく自然な出来事になりました!


 ◆ 他のプログラミング言語経験者の皆さんへ ◆ (※クリックして展開して下さい
あたい型変数と参照さんしょう型変数」

プログラミング言語の変数にはあたい型と参照さんしょう型の2種類があり言語によってどちらを使うかが決まっています。


「データを入れる箱」と考えて問題ない旧来きゅうらいのタイプの変数をあたい型変数と言います。「データの場所につける名札」と考えないといけないタイプの変数を参照さんしょう型変数と言います。 この違いは、前者がデータ自体を持っているのに対し、後者はデータ自体ではなくデータの保管場所の情報を持っているということから生じます。


Pythonの変数はすべて参照型変数になっています。CやC++を勉強した人は初めのうちは混乱こんらんすることがあるかもしれません。JavaやC#といった最近のオブジェクト指向しこう言語を勉強した人には違和感いわかんが少ないでしょう。


● C / C++ を勉強した皆さん
Pythonの変数はC/C++のポインタに似ています。違いは、データを取得するときにC/C++では間接かんせつ演算子「*」を変数名の前につけますが、Pythonでは変数名をそのまま書くだけで良いというところなどです。


● Java / C# / VB.NET を勉強した皆さん
JavaやC#、それから最近のVisual Basic等では、基本的なデータ型の変数は値型、オブジェクトの変数は参照型になります。これに比べて、Pythonではint型のような基本的なデータ型の変数も参照型になる所が違います。しかしながらプログラマ側はこのことをそれほど気にする必要がないでしょう。なぜなら、Pythonの数値型・文字列型は不変型(immutableイミュータブル型)と言ってデータ変更できない型であり、そのような不変型では値型も参照型も単に実装じっそう上の違いで、使用上の違いは通常ないからです。



変数のバインド


Pythonのコードに「1234」と書くと、整数の「1234」を表すint型のデータがコンピュータのメモリ上のどこかに作られます。このとき、せっかく作られたデータも名前をつけないと後で使えなくなってしまいます。


データ「1234」に「a」という名前をつけてみましょう。そのためには「a=1234」と書いて変数「a」という”名札”をデータ「1234」に貼り付けます。このことを「変数aをデータ1234にバインドする」と言います。バインドとは「ひもで結び付ける」という意味です。


a=1234


さて、変数「a」が本当にint型のデータ「1234」を表すようになったのか確認しましょう。次の2行をそれぞれ新しいセルに入力して実行してみてください:


a
type(a)


確かに変数「a」がint型のデータ「1234」を表すようになりました。このように、変数はデータと型の情報を持ち、セルを越えても記憶します。


変数「a」に別のデータをバインドしてみましょう。次の3行をそれぞれ新しいセルに入力して実行してみてください:


a=0.5678
a
type(a)


今度は変数「a」がfloat型のデータ「0.5678」を表すようになりました。このように、変数は何回でも別のデータにバインドできます。


なお、バインドしていない変数をいきなり使おうとするとエラーになります。


x
type(x)


また、大文字と小文字は区別します。いま、変数「a」はバインドされていますが変数「A」はバインドされていません。


A



 ★ プログラミング上級者の皆さんへ ★ (※クリックして展開して下さい
「バインド(束縛そくばく)か代入だいにゅうか」

「a=1」のような文は普通”代入文”と呼ばれますし、その操作は普通”代入”すると呼ばれます。 本講座ではそのような”代入”のうち、データの変更を伴うものを「代入」と言い、単なるラベルの付け替えでデータの変更を伴わないものを「バインド(束縛)」と言うことにします。 このような言葉の使い方は、HaskellやF#などの関数型言語にならったものです。ただし”代入文”については「代入文(assignment statement)」と言います。

手続き型言語が主流だった時代の”代入”本来の意味は「変数のデータをそっくり書き換えすること」であったはずです。それからオブジェクト指向言語の登場に伴って参照型変数が現れ、従来の変数を値型と呼ぶとともに、”代入”に「代入」と「束縛」の2つの意味が混在するようになりました。Pythonはオブジェクト指向言語ですが、変数への”代入”がすべて「束縛」であるという点は関数型言語の考えに近いものです。関数型言語では原則”束縛”という言葉を用い、変数のデータ変更はできませんが、特別にデータ変更する場合は”代入”と呼んで区別します。以上のことから、Pythonの変数は”代入”よりも”バインド”の方がイメージに合っていると言えるでしょう。実際、Python公式リファレンスでも「バインド(束縛)」という言い方をしています。

Pythonには「変数への代入」はありませんが、「代入」自体はあります。それは「オブジェクトの属性への代入」「リスト・辞書の要素への代入」の2つです。Python公式リファレンスでは代入文の役割について「名前の束縛、可変型オブジェクトの属性・要素の変更」(Assignment statements are used to (re)bind names to values and to modify attributes or items of mutable objects) とあります。なお、公式リファレンスでは変数の正体は「名前(name)」であるという扱いになっています。


print プリント関数かんすうの使い方


今までは一つのセルに一つの文を書いてきました。一つのセルに複数の文を書くこともできます。新しいセルに適当な計算式を3行ほど書いて実行してみてください。



おや?最後の行の計算結果だけが出力されました。複数の文を1つのセルに書くと出力されるのは最後に実行した文の結果のみになります。


データの内容を確認するためにいちいち別のセルを用意するのはエレガントではないですね。セルの途中でデータや変数の内容を表示したいときはprint プリント関数かんすうを使います。


先ほど書いた数式を1行ずつ「print()」のカッコの中に入れて実行してみてください。



すべての数式の結果が出力されました。このようにprint関数はカッコの中に書かれた数式やデータを計算してその場で出力し、改行かいぎょうするという働きがあります。


改行されたくないときは、print関数のカッコの中に「, end=''」を加えてください。「''」はシングルクォート「'」2つです。


print(1, end='')


改行はされなくなりましたが、何か区切りを入れたくなりますね。「end=」の部分に好きな文字列abcを入れて「end='abc'」と書くと、改行の代わりに最後にabcが出力されます。ここではコンマ「,」と空白「 」を入れてみましょう:



print関数で文字列を出力することもできます。文字列はシングルクォート「'」かダブルクォート「"」でかこみます。どちらを使っても同じです。



print関数のカッコの中にtype関数を入れて型の確認をすることもできます。



print関数についてはまだまだ勉強することがたくさんありますが今回はここまでとします。


 コラム「セルの出力とPythonの出力の違い」 (※クリックして展開して下さい

print関数を使うとtype関数の出力の様子が今までと少し違うようですね。実はprint関数の出力の方がPython本来のものです。セルの出力とPythonの出力が違うことがありますが、これはColabのベースとなっているJupyter Notebookの仕様です。


変数を含む式のバインド


変数をバインドするとき、右側にはいろいろな式を書いてOKです。式の中に変数が入っていても問題ありません。下のように入力して実行してみましょう。


a=1
b=a+1.2
print(a)
print(b)


「b=a+1.2」と書くと、変数bは式「a+1.2」を計算した結果を表すデータにバインドされます。変数aのデータはint型の「1」ですがfloat型の「1.2」を足したので変数bのデータはfloat型になります。


一度バインドしている変数であれば、自分自身を含む式をバインドしてもOKです:


b=b*10
print(b)


「b=b*10」と書くと、変数bは式「b*10」を計算した結果のデータにバインドされます。(元のbのデータはPythonがいらないと判断すれば自動的に削除されます。)


変数の表すデータを別の変数にバインドすることもできます:


c=b
print(c)


「c=b」と書くと変数cは変数bと全く同じデータを指すことになります。データがコピーされるわけではありません。データに別名を付けたと考えましょう。


変数として使える名前


変数の名前に使える文字は小文字「a,b,c,・・・,z」、大文字「A,B,C,・・・,Z」、数字「0,1,2,・・・,9」、それからアンダースコア「_」です。ただし、数字から始まってはいけません。小文字と大文字は区別します。


abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
_


それから、以下のキーワードはPythonが特別な意味で使うので、変数として使うとエラーになります。 (覚える必要はありません!)


False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield


また、エラーにはならないですが、「int」や「float」のような型の名前や「type」や「print」のような元々ある関数の名前を変数にするのはさけましょう。一度これをやると、元の意味で使えなくなってしまいます。



printをバインドしたら、print関数が使えなくなってしまいました!


こうなってしまうともう仕方がないのでColabを再起動しましょう。画面の上の方にある「ランタイム」メニューの「ランタイムの再起動」でColabを再起動できます。


delデル 文(中級者向け)


上のようになって困ったけれど再起動もしたくない場合は、「delデル」の後に変数名を書くことでバインドを解除かいじょすることができます。



元のprint関数が使えるようになりました。「del」は削除さくじょを意味するdeleteディリートの略ですが、その機能は削除ではなくバインドの解除です。(ただし、Pythonがいらないと判断すれば同時にデータも削除されます。)


 ★ print関数が復活したことに疑問ぎもんを持った皆さんへ ★ (※クリックして展開して下さい
「名前の階層かいそう

するどい人は、変数printをバインドしたときに元のprint関数が削除されるのではないかと心配になったかもしれません。あるいは、「del」でバインドを解除して「未バインド」でエラーにならないのはなぜ?と思った人もいると思います。しかしまず、print関数は「み関数」と言って重要なデータなので削除されません。また、print関数と今回作った変数printは、同じ「print」という名前ではありますが、バインドされている階層かいそうが違うので名札としては別のものになります。名前が重複ちょうふくする名札がある場合は新しい方が優先されますが、その効力がなくなると元に戻ります。


< 前の記事 | Web講座TOP | 次の記事 >

TOP