数値型と bool, None

数値型

よく使う数値型は、整数型 (int) と、実数型 (float) です。

php の整数型は、32bit と 64bit で表現できる大きさに違いがありましたが、 Python の整数型は多倍長整数という仕組みになっていて、 オーバーフローを気にする必要はありません。

>>> 2 << 100
2535301200456458802993406410752

一方、 float は php と同じような動作をします。2進数と10進数の違いによる 誤差がない実数型が欲しい場合は、標準ライブラリにある Decimal 型を使えますが、 ここでは省略します。

基本的な数値の演算は、 php と同じですが、インクリメントとデクリメントが 存在せず、代わりに累乗を求める ** 演算子があります。

>>> a = 1
>>> a += 1
>>> a
2
>>> 3 * 2
6
>>> 3 / 2
1.5
>>> 10 ** 2
100
>>> 100 ** 0.5
10.0

php では除算の結果を切り下げするには floor(3 / 2) のように書きましたが、 Python では小数点以下を切り捨てる除算として // があります。

>>> 3 // 2
1
>>> 3.5 // 2
1.0

int, float はどれも、 immutable (不変)です。不変とは、 オブジェクトの値が変更されないという事です。そのため、 += 1 のような演算をすると、 別の値をもった新しいオブジェクトが変数に代入されることになります。

>>> a = b = 1
>>> a is b
True
>>> a += 1
>>> a is b
False

immutable なオブジェクトは、代入しない限り値が変わることが無いので、例えば 知らない関数の引数に渡しても勝手に値が書き換えられるなんてことはありません。 値が変更されないので、Python は同じ値のオブジェクトを勝手に1つにまとめてメモリを 節約することができます。

>>> a = []
>>> b = []
>>> a is b  # 配列は immutable じゃないので、勝手に統一されない
False
>>> a = 1
>>> b = 1
>>> a is b  # 数値は勝手にまとめられることがある.
True

どういう条件で同じ値のオブジェクトをまとめる最適化が行われるかは言語仕様ではないので、 数値型の比較に is を使うのはよくありません。必ず同値比較 == を使いましょう。

bool 型

すでに何度も見かけた TrueFalse は、 bool 型のオブジェクトです。 bool 型も数値型と同じく immutable です。ですが、 TrueFalse は Python のインタプリタの中にそれぞれ1つずつしか存在しない(singleton)ことが 仕様になっています。

>>> a = True
>>> b = True
>>> a is b
True
>>> c = a is b
>>> c is a
True

bool 型は int 型を継承していて、 False は 0、 True は 1 という整数値になります。 なので、 php でいう === false に相当する処理が必要になった場合は、 is False を使いましょう。 (ただし、 Python ではエラーが起こったときはたいてい例外を利用するので、 ほとんどの場合 if x is False: ではなく if not x: で十分です。)

None 型

None はphp でいう null です。 これも Python ではオブジェクトで、型は NoneType になります。

TrueFalse と同じく singleton であることが仕様で決まっているので、 xNone であるかテストする場合は x is None と書きましょう。