White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

cPickleの癖?

(池上彰風に)
みなさんpythonで直列化するときにcPickleを使いますか?私は使います。


ところが次のコード、一件同じに見えますが、実は結果が変わってきます。どこが違うかわかりますか?

(注:環境はPython 2.6.4 (r264:75706), Ubuntu 9.10, x64)

>>> pickle.dumps(('', 'yystart'))
>>> cPickle.dumps(('', 'yystart'))


実は出力が違います。

>>> pickle.dumps(a)
"(S''\np0\nS'yystart'\np1\ntp2\n."

>>> cPickle.dumps(a)
"(S''\nS'yystart'\ntp1\n."

なぜ違うかおわかりですか?私はわかりません。


とりあえず、以下の形にすれば同じような形になることはわかりました。

>>> a = ('', 'yystart') #これはNG
>>> cPickle.dumps(a)
"(S''\nS'yystart'\ntp1\n."
>>> b = (a[0], a[1]) #これはOK
>>> pickle.dumps(b)
"(S''\np0\nS'yystart'\np1\ntp2\n."

'yystart'を'y'にするとp1が無くなるし、p1はポインタ辺りを表す文字列なのですかね。ソース読めば答えがあるのかもしれません。