如何覆盖现有词典Python 3

如何覆盖现有词典Python 3,python,python-3.x,class,instances,pickler,Python,Python 3.x,Class,Instances,Pickler,对不起,如果这句话用得不好,我希望你能理解/编辑我的问题,让它更容易理解 我一直在使用Pythonpickle来pickle/unpickle游戏中对象的状态(我知道这可能是非常存储的/只是一般来说效率低下和懒惰,但这只是在我学习更多python的时候)。但是,当我使用用于显示信息的类执行此操作时,会遇到错误 我认为根本的问题是,当我取消选中要加载的保存数据时,它会覆盖现有的字典,但对象存储点会发生变化,因此信息类正试图检测一个房间,因为数据被覆盖,所以播放机无法再进入该房间 我制作了一个片段来

对不起,如果这句话用得不好,我希望你能理解/编辑我的问题,让它更容易理解

我一直在使用Pythonpickle来pickle/unpickle游戏中对象的状态(我知道这可能是非常存储的/只是一般来说效率低下和懒惰,但这只是在我学习更多python的时候)。但是,当我使用用于显示信息的类执行此操作时,会遇到错误

我认为根本的问题是,当我取消选中要加载的保存数据时,它会覆盖现有的字典,但对象存储点会发生变化,因此信息类正试图检测一个房间,因为数据被覆盖,所以播放机无法再进入该房间

我制作了一个片段来重现我的问题:

import pickle

class A(object):
  def __init__(self):
    pass

obj_dict = {
                      'a' : A(),
                      'b' : A()
                       ## etc.
                    }

d = obj_dict['a']

f = open('save', 'wb')
pickle.Pickler(f,2).dump(obj_dict)
f.close()

f = open('save', 'rb')
obj_dict = pickle.load(f)
f.close()

if d == obj_dict['a']:
  print('success')
else:
  print(str(d) + '\n' + str(obj_dict['a']))

我知道在重写这样的变量时,这可能是意料之中的,但有办法解决吗?非常感谢

您是否希望
d==obj_dict['a']
评估为真

默认情况下,上面的
==
相等检查将比较两个对象的引用。也就是说,
d
obj_dict['a']
是否指向相同的内存块

当您取消pickle对象时,它将被创建为一个新对象,位于新内存块中,因此您的相等性检查将失败

您需要重写相等性检查的行为,以获得所需的行为。您需要覆盖的方法有:
\uuuuuuueq\uuuuu
\uuuuuuuuuu散列

为了通过重复酸洗和取消酸洗跟踪对象,您需要在创建时为对象指定一个唯一的id:

class A:
  def __init__(self):
    self.id = uuid.uuid4() # assign a unique, random id
现在,您必须覆盖上述方法:

def __eq__( self, other ):
  # is the other object also a class A and does it have the same id
  return isinstance( other, A ) and self.id == other.id

def __hash__( self ):
  return hash(self.id)

在你的字典里找不到昏迷是的,抱歉让我来解决。我在我的手机上做这件事对一个noob来说并不容易,但是“eq”方法什么时候调用?@JellyWX,我更新了我的答案以提供更多细节<当您使用
=
执行相等性检查时,会调用code>\uuuu eq\uuuu和
\uuuu hash\uuuu
好的,我将尝试包括这一点。如果我还有其他问题,我会回来的