gpt4 book ai didi

python - 为什么保存后加载的 pickle 与原始对象不同?

转载 作者:太空狗 更新时间:2023-10-30 02:35:53 24 4
gpt4 key购买 nike

我使用 pickle 来保存对象列表。在用 pickle 保存列表并再次加载这个完全相同的列表后,我将新加载的列表与原始列表进行比较。奇怪的是,这两个对象不同。为什么会这样?不应该一样吗?

我已经尝试只使用初始化函数中定义的实例属性而不使用类属性,但错误仍然存​​在。

import pickle as p

class Person(object):
def __init__(self, name=None, job=None, quote=None):
self.name = name
self.job = job
self.quote = quote


personList = [Person("Payne N. Diaz", "coach", "Without exception, there is no rule!"),
Person("Mia Serts", "bicyclist", "If the world didn't suck, we'd all fall off!"),
Person("Don B. Sanosi", "teacher", "Work real hard while you wait and good things will come to you!")]

with open('test_list.p', 'wb') as handle:
p.dump(personList, handle, protocol=p.HIGHEST_PROTOCOL)

with open('test_list.p', 'rb') as handle:
personList2 = p.load(handle)

print(personList == personList2)

我希望打印出 True,但打印出的结果是 False。

最佳答案

您还没有定义比较 Person 对象的显式方法。因此,Python 比较它们的唯一方法是通过它们的 ID(即它们的内存地址)。您从 pickle 加载的项目的地址将与原始地址不同 - 因为它们是新对象,所以它们必须不同 - 因此列表不会比较相等。

您可以在 Person 类上显式声明 __eq__ 方法:

class Person(object):
def __init__(self, name=None, job=None, quote=None):
self.name = name
self.job = job
self.quote = quote

def __eq__(self, other):
return (self.name == other.name and self.job == other.job and self.quote == other.quote)

现在您的比较将按预期返回 True。

关于python - 为什么保存后加载的 pickle 与原始对象不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57575831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com