Python pickle: засоленные объекты не равны исходным объектам
Я думаю, что это ожидаемое поведение, но хочу проверить и, возможно, выяснить, почему, поскольку исследование, которое я провел, оказалось пустым
У меня есть функция, которая извлекает данные, создает новый экземпляр моего пользовательского класса, а затем добавляет его в список. Класс просто содержит переменные.
Затем я перетаскиваю этот список в файл, используя протокол 2 как двоичный файл, позже я перезапускаю скрипт, повторно извлекаю данные из моего источника, у меня есть новый список с моими экземплярами пользовательских классов, для тестирования я сохраняю данные источником данные одинаковые.
Перезагрузите файл рассола
Теперь, когда я делаю:
print source_list == pickle_list
это всегда возвращается False
и я понятия не имею, почему, если я распечатываю списки или смотрю на структуру, они выглядят точно так же.
Любые идеи были бы блестящими, это мой последний маленький кусочек, который мне нужно отсортировать.
2 ответа
Сравнение двух объектов одного и того же класса по умолчанию выдает False (если только они не являются одним и тем же объектом), даже если они имеют одинаковое содержимое; другими словами, два интуитивно "идентичных" объекта из одного и того же класса по умолчанию считаются разными. Вот пример:
>>> class C(object):
... def __init__(self, value):
... self.value = value
...
>>>
>>> C(12) == C(12)
False
Вы хотите определить __eq__()
(а также __ne__()
) в вашем пользовательском классе, чтобы он выдавал True для объектов, содержащих одинаковые данные. Более подробную информацию можно найти в официальной документации. Для приведенного выше примера это будет:
>>> class C(object):
... # ...
... def __eq__(self, other):
... return self.value == other.value
... def __ne__(self, other):
... return not self == other # More general than self.value != other.value
...
>>> C(12) == C(12) # __eq__() is called
True
>>> C(12) != C(12) # __ne__() is called
False
Ваши занятия, скорее всего, не определяют значимого __eq__
и, таким образом, сравниваются на предмет идентичности. Поскольку классы, загруженные из солений, не совпадают с объектами в сгенерированном списке (даже если они имеют одинаковые данные), вы получаете False
,