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

2024-09-27 09:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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)

我希望真的会打印出来,但是打印出来的结果是假的


Tags: nameselfnoneyou列表属性initas
2条回答

运行代码并打印personList1和personList2;似乎是在检查对象是否相同,而不是内容是否相同

False
[<__main__.Person object at 0x000001A8EAA264A8>, <__main__.Person object at 0x000001A8EAA26A20>, <__main__.Person object at 0x000001A8EAA26F98>]
[<__main__.Person object at 0x000001A8EAA26240>, <__main__.Person object at 0x000001A8EAA260F0>, <__main__.Person object at 0x000001A8EAA26908>]

如果您将print语句更改为以下内容,它将生成true,因为它正在检查内容

print(personList[0].name == personList2[0].name)

您尚未定义比较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

相关问题 更多 >

    热门问题