如何在Python中创建pickle友元对象id?

如何在Python中创建pickle友元对象id?,python,pickle,Python,Pickle,我试图用Pythonpickle模块持久化一些Python对象,这些对象使用 id(object) 作为其外部标识符(例如,在网页上) 问题是,我发现在pickle转储/加载循环之后,id(object)值会发生变化。这使得id(object)对于期望值不变的外部标识符不可用 那么,我如何方便地创建一个id,它在pickle/unpickle之后不会更改?您不能 id的文档: 返回对象的“标识”。这是一个整数(或长) 整数),保证此对象的唯一性和常量 在它的有生之年 因此,两个不同的对象(即如

我试图用Python
pickle
模块持久化一些Python对象,这些对象使用

id(object)
作为其外部标识符(例如,在网页上)

问题是,我发现在
pickle转储/加载循环之后,
id(object)
值会发生变化。这使得
id(object)
对于期望值不变的外部标识符不可用

那么,我如何方便地创建一个
id
,它在
pickle/unpickle
之后不会更改?

您不能

id
的文档:

返回对象的“标识”。这是一个整数(或长) 整数),保证此对象的唯一性和常量 在它的有生之年

因此,两个不同的对象(即如果
a不是b
True
)具有两个不同的ID

备选方案:

(1) 如果您的类型是可哈希的,则可以使用
哈希

hash((1,2,3))
(2) 只有少数东西是可以散列的,但你可以把泡菜散列,例如

hash(pickle.dumps([1,2,3]))

(3) 您可以为每个对象显式设置一个
id
属性。

FWIW,使用id可能不是一个好主意。您不能保证id是唯一的,因为该id只保证在对象的生命周期内是唯一的。如果一个对象被垃圾回收,另一个对象可以“取代它”并获取那个免费id。@mgilson,有点像。如果您使用的是完整散列,而不是像
散列(x)%100
,那么当您中奖时被闪电击中时,您需要一个散列。@PaulDraper:实际的散列冲突并不罕见。即使散列是完全随机的,在冲突概率上升到50%以上之前,您只需要大约80000个对象。此外,散列也不能保证在执行过程中保持一致。它们通常是,但可能不在不同的解释器设置或不同的解释器上。@user2357112,true。这取决于它们的用途。如果有2个对象,则概率(在CPython中,64位)小于0.0000000000001。但在一般情况下,64位远远不够。解释器之间的一致性是更大的缺点。hash()不起作用。因为它在不同的会话中给出不同的散列。