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