我遇到了一些奇怪的行为,泡菜为相同的输入生成了不同的序列化输出。序列化反序列化的腌制对象时,它会以某种方式触发(如果从mp.Queue
中检索到该对象,则会发生这种情况)。它也仅在列表具有多个元素(不确定原因)时发生。有人可以解释这里发生了什么吗?我已经读过this question,但情况似乎并不一样,a
,b
,c
都有不同的ID。
下面复制的代码。我正在使用Anaconda的Python 3.6.3。
import pickle
import numpy as np
def f():
return np.array([1,2,3])
a = f()
b = f()
c = pickle.loads(pickle.dumps(f()))
print(id(a), id(b), id(c)) # 4464565184 4464565504 4466959424
print('[a]==[b]', pickle.dumps([a]) == pickle.dumps([b])) # True
print('[a]==[c]', pickle.dumps([a]) == pickle.dumps([c])) # True
print('[b]==[c]', pickle.dumps([b]) == pickle.dumps([c])) # True
print('[a,b]==[a,c]', pickle.dumps([a,b]) == pickle.dumps([a,c])) # False
print('a.tolist()==c.tolist()', a.tolist()==c.tolist()) # True
答案 0 :(得分:0)
这似乎是特定于numpy的问题,因为没有它,pickle可以正常工作 在python 3.6.6中:
import pickle
def f():
return [1,2,3]
a = f()
b = f()
c = pickle.loads(pickle.dumps(f()))
print(id(a), id(b), id(c)) # 1900503702728 1900503865288 1900503976328
print('[a]==[b]', pickle.dumps([a]) == pickle.dumps([b])) # True
print('[a]==[c]', pickle.dumps([a]) == pickle.dumps([c])) # True
print('[b]==[c]', pickle.dumps([b]) == pickle.dumps([c])) # True
print('[a,b]==[a,c]', pickle.dumps([a,b]) == pickle.dumps([a,c])) # True