所以我有这个模块 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
答案 0 :(得分:1)
发生此问题的原因是两个事件的顺序:
Skill
定义(在您首次导入定义了dicts
的{{1}}模块时发生。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类可以实例化为带有损害值的 。有很多方法可以解决您的特定问题。