路地裏牧場

技術系ブログだったけどごった煮になった謎ブログ

2015/04/16 - Python備忘録

Windows7 64bit、Python 3.4.2、PyCharm 4 すごく初歩。

is は同一、==は同値

isは2つの値のアドレス(値の場所)が同じか、==は2つの値を同じとみなすか、という違い。 要するに、

(1, 2, 3) is (1, 2, 3)
(1, 2, 3) == (1, 2, 3)

この例では左右別々でタプルを生成してるので、アドレスは異なる。ので、アドレスを比較するisFalseとなる。対して、==では構造を比較するのでTrueとなる。

文字列はPythonが再利用とかして同一のものを使うようにしてるので、isでOKらしい。

比較の速度は圧倒的にisが速いので、上記の文字列や、真偽値、数値、Noneなどのisで比較しても問題ないものはisを使いましょう。という話。ちなみに否定演算子not!=に対応するものはis notだ。自然言語っぽくて良い。

辞書型オブジェクトはデフォルト値が使える

辞書型オブジェクトというのは、

user_getaji = {"name": "Getaji", "age": 17}

user_getaji["age"] == "17    # True

という、キーと値のペアのリスト。

配列のようにdict_obj[key]という記法でそのキーに紐付けられた値を取得できるのがとても便利なのだが、キーが存在しない場合KeyError例外が送出される。

user_getaji["real_age"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'real_age'

これをキャッチしてキーが存在しない場合の値、いわゆるデフォルト値を使うという処理は結構面倒でかさばったりする。そこで、辞書型オブジェクトのメソッドget()にはデフォルト値を渡すことができる。

user_getaji.get("real_age", 17)

この例だと17がデフォルト値だ。user_getajiにはreal_ageキーは存在しないため、17が返る。