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はポインタ辺りを表す文字列なのですかね。ソース読めば答えがあるのかもしれません。