取消字典会产生粘性值

时间:2018-04-04 19:33:04

标签: python dictionary pickle

为了熟悉Python数据结构和流行模块,我正在设计一个RPG(是的,当时我认为这是一个新颖的想法)。我的'hero'类有两个属性,特别是在通过Pickle保存和加载我的游戏文件之前和之后表现不一致。我已经在我的代码中针对几个示例仔细验证了正确的语法,现在我确信在工作中必须存在一些我不理解的基本行为。 我的'hero'类的第一个属性是inventory,它初始化为一个空列表。第二个属性是设备,它是表格

的字典
{'Mainhand': '', 'Offhand': '', ... etc.}

我可以通过将对象指定为此字典中设备插槽的值来装备和取消我的Gear类的实例,并且一切都很好用,直到我从加载的保存文件中尝试这些内容。如果我试着解开一些东西,代码行

hero.equipment[k] = ''

完全被忽略,没有错误消息或崩溃。我可以换档,但不能简单地取消任何插槽,就像我在保存/加载之前一样。

我不理解Pickle如何解压缩保存的对象词典?是什么让我的价值感觉如此......粘性?

EDIT :: 这些是根据启动时给出的英雄名称保存和加载我的文件的功能。

def save_game():
    filename = str(hero.name) + ".pkl"
    with open(filename, 'wb') as outfile:
        pickle.dump(hero, outfile)
        print("Progress saved.")
        outfile.close()

def load_game():
    global hero
    filename = input("What did they call you?\n")
    filename = str(filename) + ".pkl"
    if os.path.exists(filename):
        with open(filename, 'rb') as infile:
            hero = pickle.load(infile)
            print("Previous progress loaded.")
            infile.close()
    else:
        print("You have no saved progress.")

这是取消我的项目的功能(适用于新文件,而不是加载文件)

def unequip(self, equipping_str, unequipping_obj):
        if unequipping_obj not in hero.inventory:
            hero.inventory.append(unequipping_obj)
        ohAtkPenalty = 1
        if equipping_str == 'Offhand':
            ohAtkPenalty = 0.70
        hero.melee_boost -= unequipping_obj.melee_atk * ohAtkPenalty
        hero.magic_boost -= unequipping_obj.magic_atk * ohAtkPenalty
        hero.health_regen -= unequipping_obj.health_regen
        hero.mana_regen -= unequipping_obj.mana_regen
        hero.equipment[equipping_str] = '' 
        print("You unequip your ", unequipping_obj.item_name, '.', sep='')
        unequipping_obj.quantity += 1

1 个答案:

答案 0 :(得分:0)

因为unequip()是一个英雄类的方法,所以对英雄属性的所有引用都应该写成'self。 ......',而不是'英雄。 ......” 解决方案比我预期的要少得多,但我非常感谢额外的目光。