Python 3.x 如何使函数使用之前在Python中的另一个函数中定义的变量?

Python 3.x 如何使函数使用之前在Python中的另一个函数中定义的变量?,python-3.x,Python 3.x,我正在为一款可以与经典的DnD地牢爬行相媲美的游戏编写代码。我已经定义了几个包含字符统计和目录的字典。它们看起来像这样: enemy_mid = {'hp': 100, 'ag': 50, 'sp': 60, 'st': 70, 'wep': sword, 'arm': leather, 'sld': buckler} def assign_attacker(): attacker =

我正在为一款可以与经典的DnD地牢爬行相媲美的游戏编写代码。我已经定义了几个包含字符统计和目录的字典。它们看起来像这样:

enemy_mid = {'hp': 100,
         'ag': 50,
         'sp': 60,
         'st': 70,
         'wep': sword,
         'arm': leather,
         'sld': buckler}
def assign_attacker():
attacker = character
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower()
if enemy_choice == "easy":
    defender = enemy_easy
elif enemy_choice == "med":
    defender = enemy_med
elif enemy_choice == "hard":
    defender = enemy_hard
else:
    print("invalid")
目前玩家有一本字典,玩家可以面对不同难度的敌人有3本字典。现在,当战斗开始时,调用函数“assign_attacker()”来决定玩家将面对哪些敌人。函数如下所示:

enemy_mid = {'hp': 100,
         'ag': 50,
         'sp': 60,
         'st': 70,
         'wep': sword,
         'arm': leather,
         'sld': buckler}
def assign_attacker():
attacker = character
enemy_choice = input("Would you prefer your enemnt to be easy, medium or hard, in terms of difficulty? (easy/med/hard): ").lower()
if enemy_choice == "easy":
    defender = enemy_easy
elif enemy_choice == "med":
    defender = enemy_med
elif enemy_choice == "hard":
    defender = enemy_hard
else:
    print("invalid")
调用此函数后,程序将需要决定谁拥有主动权。应使用以下功能执行此操作:

def initiative():
if attacker['sp'] > defender['sp']:
    init = "att"
elif attacker['sp'] == defender['sp']:
    init = "null"
else:
    init = "def"
print(init)

但是,当调用此函数时,会出现一个错误,表明未定义“攻击者”。我知道“攻击者”是一个局部变量,不能在其他函数之外调用,但我不知道最好的方法是什么来确保这个变量可以在任何地方调用。我听说使用“global”是一种非常糟糕的做法,因为这个变量以后会在我的代码中大量使用,所以我想找出定义这个变量的最佳方法。当然,这也适用于“defender”变量。

您可以简单地修改assign攻击者以返回
(攻击者,defender)
的元组,并将其作为参数传递给initiative函数

#rest of your assign function
else:
    print("invalid")
return (attacker,defender)
你的计划看起来像

def initiative( players ) : 
    attacker = players[0]
    defender = players[1]

其中
players=assign\u attacker()

我会为我的游戏使用一个类(可能还有
defender
attacker
之类的类)。下面是一个超级简化的示例:

class Game:

    def test(self):
        self.defender = 'hello'
        self.attacker = 'world'

    def test2(self):
        print(self.defender + self.attacker)

    def test3(self):
        self.defender = 'goodbye'

g = Game()
g.test()    # initial values set for self.defender and self.attacker
g.test2()   # prints 'helloworld'
g.test3()   # changes value of self.defender to 'goodbye'
g.test2()   # prints 'goodbyeworld'
这里的要点是,您的所有方法都可以访问
self.defender
self.attacker
,当您更改这些变量时,这些方法将知道这些更改。不过,您需要确保
self.attacker
self.defender
以及以这种方式使用的任何其他变量在被访问之前都已初始化。例如,在上面的类中,如果在
test()
之前调用
test2()
test3()
,将引发错误,因为变量还不存在。您可以在类的
\uuuu init\uuuu()
方法或
开始游戏()
方法中初始化这些变量,例如:

def __init__(self):
    self.defender = some_initial_value
    ...
或者,您可以为初始值传入对象:

def __init__(self, defender):
    self.defender = defender
    ...
实例化类时(即,如果传入初始值,则在执行
g=Game()
g=Game(defender\u obj)
操作时),将调用
\uuu init\uuu
方法


如果您是Python类新手,这是一个关于该主题的交互式教程,如下所示。

看起来
character
是脚本中的一个全局变量。为什么不在
initiative()的顶部包含
attacker=character
函数?很抱歉,我没有提到这一点,但它也适用于“defender”变量。在没有看到代码的情况下,我会把players=assign\u attacker()放在哪里?我猜你有一个代表游戏的循环,所以在调用assign\u attacker之后和主动之前放在该循环中。