文字列を 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 文字列はオブジェクトと見なすべきなのでしょう。
同様に、数値非オブジェクトで、配列オブジェクト