Pythonの辞書にunicodeとstrで同一の文字列を入れたらどうなるか

In [1]: {u"a": 1, "a": 2}
Out[1]: {u'a': 2}

ほう、なるほど。これは

In [2]: u"a" == "a"
Out[2]: True

なのでu"a"と"a"が同一視されているんだな。もちろん

In [3]: u"a" is "a"
Out[3]: False

なのだけど、isで「同じキーか」のチェックをしたのでは

In [4]: (1, 2) is (1, 2)
Out[4]: False

とタプルが区別されてしまって嬉しくない。言語を設計するうえで割と悩ましいところだよね。このバイト列とユニコード文字列の自動変換は色々なわかりにくいバグの原因になるのでPython3.0からは取り除かれた。

>>> b"a" == "a"
False
>>> {b"a": 1, "a": 2}
{b'a': 1, 'a': 2}