Windows Live Writer で遊んでいたら、間違って前回の記事を消してしまった。復活できると若干嬉しい(中さん宛)。
取り敢えず、前回の記事が不正確だった事を詫びる。概、間違いではないのだが、不十分な説明のため誤解を招く恐れがあるのでここで補足したい。
Python では以下が成り立つと書いた。
a = 10
b = 10
上記は確かに成り立つが、これはキャッシュするに値する数値の場合だけだ。Python 2.5 で一体幾らの数値までキャッシュするのか検証してみよう。まずは Python のおさらい。
>>> a = 10
>>> b = a
>>> a is b
True
is 演算子は変数が同じリファレンスを持っている場合 True となる。そして以下は数値がキャッシュされているので成り立つ。
>>> a = 10
>>> b = 10
>>> a is b
True
続けよう。
>>> a = 999
>>> b = 999
>>> a is b
False
と、これだけで気付いたと思う。おそらく 1 byte で納まる範囲をキャッシュしている。
>>> a = 255
>>> b = 255
>>> a is b
True
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
…あれ?256 は 1 byte に納まらないんですけど…。
文字列も同様で、ある程度の長さの文字列はキャッシュされ、同じインスタンスが使いまわされる。このように、ある程度の大きさの数値や文字列はキャッシュされるのだ。
Jitta さんから質問があったので以下も載せておく。
>>> a = 10
>>> b = 10
>>> a = b + 1
>>> c = 11
>>> a is c
True
ところで、.NET の String Intern pool はどんなに長い文字列でもプールするのだろうか?知っての通り、文字列の比較はコストが高い。しかも長い文字ほどプールに存在する確率は低くなるだろう。 如何なる文字列もプールし、如何なる文字列もプールから探すのだろうか?
この話は次回予定(たぶん)。