2008.07.29
Pythonは全部がオブジェクト(C言語でいうところの「ポインタ」なお話)
弊社に来年4月からやってくる新卒の学生に Python の勉強をしてもらおうと思っていたのだが、先日聞いたところでは大学で C言語 をやっているらしい。
それを聞いて Python の勉強はまだ良いから C をしっかりやって欲しいと伝えた。
C言語 は良い言語だ。C++ はもちろん、PHPも Java も他の言語も少なからず C言語 の影響は受けている。
Webサービスをやっているだけなら C言語 はほとんど使わないが、比較的余裕のある学生のウチに C を学べるのはとっても良いと思う。
今日は、C言語を学んだ人が最初に不思議に感じる「Pythonでは全てがオブジェクトとして扱われる」というお話。
Pythonの特徴について、前回は C言語 の文法と比較して、switch文がないことやブロック(for文のループ範囲)をインデントで表すことなどと書いたが、それよりも大きな違いがある。
C言語とは違い、変数や関数など全てが「オブジェクト」として扱われることだ。
厳密にいうと「変数」と呼んでいるものの考え方が違う。
例えば、
a = 1
という記述で考えてみよう。
C言語の場合、変数は必ず宣言してから使う。この場合なら、int a; となる。この時点で「箱」が出来上がり、例えば int型 ならば4バイト(注:環境依存)の領域が用意される。
Pythonの場合は変数は「箱」ではなく値へのタグのような扱いで、「1」という実際の数値が格納されているのは「オブジェクト」に当たる。そう、この場合の a は C言語 でいうところの「値を参照するためのポインタ」なのだ。
そしてこのポインタには”型”がないので、数値代入の後に文字列を代入することもできる。
a = 1
a = ‘hogehoge’
といったことを書いてもエラーにはならない。
プログラミングの勉強を Python から入った人にとっては、このように変数には数値も文字も代入できるといっても「ふ~ん」と何も疑問を抱かないだろう。
ところが C言語 や Java 、C++ などを先に勉強した人にとっては何ともキモチ悪い。
C言語やアセンブラを知っている人からしてみると「果たしてメモリの中はどうなっているんだ?」と思ってしまうが、Pythonは「変数も関数も全てがオブジェクト」であり「変数として表記しているのはポインタのようなもの」とわかると実にシンプルなことがわかる。
今では逆に C言語 の方が複雑に感じるぐらいだ。
関数もオブジェクトというのは例えばこんな書き方ができるということ。
>>> #関数を定義
>>> def say_hello():
>>> print ‘hello’
>>>
>>> say_hello() #関数を実行
hello
>>> a = 1
>>> a
1
>>> a = say_hello #変数に関数を代入
>>> a()
hello
すなわち、Pythonでは変数や関数として記述する半角英数による “文字列” は実体へのポインタであり、この実体にあたるものを “オブジェクト” と呼んでいるわけだ。
そしてPythonはこうした構造を取ったことで、リスト(C言語の配列)の中には数値も文字列も関数も持てるような言語が実現できた(実現した)と言えそう。
Trackback URL
Comment & Trackback
Comment feed
Comment