【发布时间】:2018-07-15 19:25:35
【问题描述】:
我遇到了一些奇怪的行为,其中 pickle 为相同的输入生成不同的序列化输出。它在序列化反序列化的腌制对象时以某种方式触发(如果从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
【问题讨论】: