【Python】動的型付け(Dynamic Typing)

python_logo

こんにちは!

今回はPythonの特徴の一つである型宣言についてまとめます。

私はもともとJavaを学んでいたので、これはかなり不思議でした。

どうやってPythonは型情報を保持しているのだろうか?

今回はそれについて分かりやすくしたいとおもいます!

そのためには・・・

Pythonの変数の仕組みについても触れていきます!

それではいってみましょう!

目次

  1. Pythonは型宣言がない
  2. 変数の役割
  3. オブジェクトの役割
  4. 変数作成の流れ

Pythonは型宣言がない

Pythonには型宣言がないのは、もはやご存じの通りだと思います。

型宣言というのは、例えばCやJavaでこの変数xをint型で使いますよって変数を使う前に宣言することになります。

Pythonでは型宣言はしません。なぜなら変数を代入するときに型情報もはいっているのです。

ですから、プログラムの実行時に型が自動的に決まります。

そこから動的型付け(Dynamic Typing)と呼ばれています。

じゃあ、どうやって型が決まるのか?気になりますよね。

そこには変数とオブジェクトの役割が非常に重要になってきます。

変数の役割

変数はオブジェクトへのリファレンスのみを保持しています。

プログラムのオブジェクトはコンピュータのメモリに格納されています。リファレンスはオブジェクトの格納されているメモリの場所を指示しているのです。

ざっくりいえば、変数はただオブジェクトがどこに入っているかの情報があります。

C言語をやっている人であればポインターに近いイメージです。ですがPythonのリファレンスはそれよりも扱いやすくなっています。

オブジェクトの役割

実はオブジェクト自身が型情報を持っています

例えば、整数100の値をいれるとその値と同時に自分が整数であるという識別子をもつのです。

それはオブジェクトがヘッダー領域を持つから実現できています。

そしてオブジェクトには2つのヘッダー領域があります。型情報とリファレンスカウンターです。

リファレンスカウンターについてはガベージコレクションと関りが深いので、その時に話します。簡単にいうなら、リファレンスカウンターはいつこの変数はメモリ上から消えるのかを管理しているのです。

変数作成の流れ

変数とオブジェクトの役割が分かれば後は簡単です。変数の代入というのは、変数とオブジェクトをリンクさせることに他なりません。

また変数の作成は値が代入されることでしか作られません。Pythonでは予め変数を作っておくことができないのです。

ですからざっくりと変数がどのように作られるかというと・・・

  1. オブジェクトを作成
  2. 変数作成
  3. 変数がオブジェクトへのリファレンスをもつ

このように変数が格納されます。

実行時に、変数がもつオブジェクトのリファレンスをたどることで、変数とオブジェクトの対応関係が分かります。

まとめ

いかがだったでしょうか?

今回の重要な要点は以下の2つです。

  • 変数はオブジェクトへのリンクを持つのみ
  • オブジェクトは値のほかにも型情報をもつ

また、Pythonの変数は代入でしか作られないことも重要です。defによる関数、import文,class文でさえ代入処理なのです。

これはそれぞれの記事で説明していきたいと思います。

以上になります。

みなさんのPythonライフがより良くなるように祈っています!