如何覆盖现有字典 Python 3
How to overwrite an existing dictionary Python 3
抱歉,如果措辞不好,我希望你能understand/edit我的问题,让它更容易理解。
我一直在使用 python pickle 来 pickle/unpickle 游戏中对象的状态(我知道这可能非常 storage/just 通常效率低下且懒惰,但仅当我了解更多 python)。但是,在使用 classes 显示信息时,我遇到了错误。
我认为根本问题是,当我解开要加载的保存数据时,它会覆盖现有字典但对象存储点会发生变化,因此信息 class 正在尝试检测一个房间由于数据被覆盖,玩家无法再进入。
我制作了一个片段来重现我遇到的问题:
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']
将您的问题评估为真吗?
默认情况下,上述==
相等性检查将比较两个对象的引用。 IE。 d
和 obj_dict['a']
是否指向同一块内存?
当您取消选择您的对象时,它将作为一个新对象在新的内存块中创建,因此您的相等性检查将失败。
您需要覆盖相等性检查的行为方式以获得您想要的行为。您需要覆盖的方法是:__eq__
和 __hash__
.
为了通过重复 pickling 和 un-pickling 来跟踪您的对象,您需要在创建时为对象分配一个唯一 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)
抱歉,如果措辞不好,我希望你能understand/edit我的问题,让它更容易理解。
我一直在使用 python pickle 来 pickle/unpickle 游戏中对象的状态(我知道这可能非常 storage/just 通常效率低下且懒惰,但仅当我了解更多 python)。但是,在使用 classes 显示信息时,我遇到了错误。
我认为根本问题是,当我解开要加载的保存数据时,它会覆盖现有字典但对象存储点会发生变化,因此信息 class 正在尝试检测一个房间由于数据被覆盖,玩家无法再进入。
我制作了一个片段来重现我遇到的问题:
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']
将您的问题评估为真吗?
默认情况下,上述==
相等性检查将比较两个对象的引用。 IE。 d
和 obj_dict['a']
是否指向同一块内存?
当您取消选择您的对象时,它将作为一个新对象在新的内存块中创建,因此您的相等性检查将失败。
您需要覆盖相等性检查的行为方式以获得您想要的行为。您需要覆盖的方法是:__eq__
和 __hash__
.
为了通过重复 pickling 和 un-pickling 来跟踪您的对象,您需要在创建时为对象分配一个唯一 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)