文字列を is 演算子で比較するのは危険
ascii 文字列は ==, is のどちらでも同じ結果を返します。
一方、unicode 文字列は is で比較した場合の結果が異なります。
# ascii 文字列の比較 a = 'str' b = 'str' a == b >>> True a is b >>> True # unicode 文字列の比較 a = u'str' b = u'str' a == b >>> True a is b >>> False u'str' is u'str' >>> True
ドキュメンテーションによると、
演算子 is および is not は、オブジェクトの アイデンティティに対するテストを行います: x is y は、 x と y が同じオブジェクト を指すとき、かつそのときに限り真になります。
とあり、is 演算子はインスタンス ID が同じかどうかを比較するようです。
Python では ascii 文字列は非オブジェクトで、unicode 文字列はオブジェクトと見なすべきなのでしょう。
同様に、数値は非オブジェクトで、配列はオブジェクト。