【问题标题】:Unpickling a dictionary produces sticky values [closed]解开字典会产生粘性值[关闭]
【发布时间】:2018-04-04 19:33:03
【问题描述】:

为了熟悉 Python 数据结构和流行的模块,我正在设计一个 RPG(是的,当时我认为这是一个新颖的想法)。我的“英雄”类有两个属性,特别是在通过 Pickle 保存和加载我的游戏文件之前和之后的行为不一致。我已经根据几个示例仔细验证了我的代码中的正确语法,现在我确信肯定有一些我不理解的潜在行为在起作用。 我的“英雄”类的第一个属性是库存,它初始化为一个空列表。第二个属性是设备,是一个字典形式

{'Mainhand': '', 'Offhand': '', ... etc.}

我可以通过将对象分配为该字典中设备槽的值来装备和取消装备我的 Gear 类的实例,并且一切都很好,直到我从加载的保存文件中尝试这些东西。如果我尝试卸载某些东西,代码行

hero.equipment[k] = ''

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

关于 Pickle 如何解包保存的对象字典,我有什么不明白的地方?是什么让我的价值观感觉如此……粘稠?

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

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

【问题讨论】:

  • 尝试创建一个mvce,以便我们验证行为。将其编辑到您的问题中。谢谢
  • 添加代码...欢迎任何和所有反馈。我很想得到这个工作!
  • 好吧,盯着我的代码看了一周还是不行;把它贴在这里,10分钟后我弄明白了。 '英雄。 ...”应该是“自我”。 ...' 在最后一段代码中。仍然不确定为什么没有抛出错误,但它现在可以正常工作。我需要做些什么来结束这个问题吗?
  • 这是 mvce 的第二个原因 ;) 通过准备它,你又想多了:) - 你可以自己回答它并在 48 小时内接受 int - 这样你就可以在你的问题上保持 2 分。或者删除它。

标签: python dictionary pickle


【解决方案1】:

因为 unequip() 是 hero 类的一个方法,所以所有对 hero 属性的引用都应该写成 'self. ...',而不是'英雄。 ...' 解决方案远没有我预期的那么令人兴奋,但我非常感谢大家对它的关注。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2021-10-25
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多