该怎么做而不是添加/更改全局变量

时间:2014-05-12 22:24:15

标签: python python-3.x

我对编程很陌生并且我一直在阅读“使用方法来改变全局变量并不是很好的编码。使用非常少的全局变量并且绝对不会改变它们”。我似乎无法找到一个很好的解释为什么或应该做什么。

让我们说我想要某种游戏。它有变量health=100。现在我认为这应该是一个全局变量而不是在一个类/对象中,但这也意味着我需要通过执行以下操作来调整它等等:

def minushealth():
    global health
    health -= 20

我似乎无法弄清楚这一点,也许这里有一些我不知道的简单。

3 个答案:

答案 0 :(得分:2)

您可以使health成为显式参数并从函数返回值:

def minus_health(health):
   return health - 20

然后在调用时指定返回值:

health = minus_health(health)

更好的是,摆脱"魔术数字"带有可选的第二个参数:

def minus_health(health, amount=20):
   return health - amount 

请注意,您现在可以测试minus_health,如:

assert minus_health(100) == 80

如果您使用global实施,则必须执行以下操作:

health = 100
minus_health()
assert health == 80

在这个简单的例子中,它可能看起来不是一个大问题,但随着程序变得越来越复杂,你需要做更多的设置和拆卸工作,而一个良好隔离的功能仍然可以在一行中有效测试。

答案 1 :(得分:1)

jonrsharpe的回答很明确。

但是对于游戏类型的答案,你最好使用看起来像这样的类/属性解决方案:

player_object.minus_health()

minus_health的样子如下:

class Player(object):
    def __init__(self):
        __health = 100

    def minus_health(self):
        self.__health -= 20

当然,如果健康状况低于0等,则不考虑这一点。但是你应该明白这一点。这种方式允许所有“玩家”具有单独的健康属性。

答案 2 :(得分:0)

另一个答案中显示的Player类可能是您最终的结果,但只是对函数参数的解释,您只能修改 mutable 的参数。在您指定的情况下,类似于Player类的方法,但更简单,是在dict中管理您的状态,然后将该字典传递给函数以修改属性:

def minus_health(entity, amount=-20):
    entity['health']+=amount

# Use like so
player = dict(name='John', health=100)
minus_health(player)

listobject s也是可变的,并且可以以类似的方式工作,即它们的内容可以在函数内修改。