从其他文件更改字典值

时间:2018-10-24 14:21:07

标签: python

所以我有这个模块 player.py ,它是玩家的类,在我的游戏开始时会实例化该类,并使用 hp和dmg 创建一个玩家对象>在另一个模块 dicts.py 上,我在字典中存储了一些技能,如下所示:

new_dmg = 0

Skill = {
    'double_dmg': {
    'dmg': new_dmg * 2
   }
}

,然后在 player.py 中,我在__init__函数中设置了new_dmg

def __init__(self, hp, dmg):
    self.dmg = dmg
    self.hp = hp
    dicts.new_dmg = dmg

但是,好像dmg技能将在实例化我的玩家课程之前被设置为0 * 2,这发生在游戏的一开始,我相信这是一件容易的事,但是我无法即使我花了很多时间在python上,也要掌握如何做。任何解释/解决方法都将非常有用<3

2 个答案:

答案 0 :(得分:1)

发生此问题的原因是两个事件的顺序:

  1. Skill定义(在您首次导入定义了dicts的{​​{1}}模块时发生。
  2. 执行Skill(然后您创建类的对象)

程序的结构方式不能在#1之前进行#2,因为__init__使用__init__中定义的new_dmg,因此必须导入dicts首先进入dicts,这意味着在player有机会更新dicts之前执行__init__模块。

答案 1 :(得分:0)

根据您的评论,似乎困惑在于Python如何实例化模块和/或对表达式进行求值。当您这样做时:

new_dmg = 0

Skill = {
    'double_dmg': {
    'dmg': new_dmg * 2
   }
}

导入时,名为dict的{​​{1}}如下所示:

Skill

那是因为我们生成了一个 new 整数{'double_dmg': {'dmg': 0}} (替换为0 * 2的值),其结果为new_dmg。整数是不可变的,因此当我们有一个计算结果为整数的表达式时,就会创建一个 new 整数。这意味着我们不会在0 new_dmg内保留对Skill的引用,因此更改dict不会更改{{1} }。

要对此进行测试,只需将其放入文件中并在您的Python解释器中运行即可:

new_dmg

请注意,Skill并没有改变,因为同样,它是在导入时定义和评估的。 并且整数是不可变的类型。因此,更改>>> import dicts >>> dicts.Skill {'double_dmg': {'dmg': 0}} >>> dicts.new_dmg = 500 >>> dicts.Skill {'double_dmg': {'dmg': 0}} 不会{em>不会更改Skill中的任何内容。如果您想更改它,只需直接执行:

new_dmg

或者,使您的dicts类可以实例化为带有损害值的 。有很多方法可以解决您的特定问题。