Python 如何代替添加/更改全局变量
我对编程非常陌生,我到处都在读“使用方法更改全局变量不是很好的编码。使用很少的全局变量,绝对不要更改它们”。我似乎找不到一个很好的解释来解释为什么或者应该做什么 假设我想玩一个游戏。它具有变量Python 如何代替添加/更改全局变量,python,python-3.x,Python,Python 3.x,我对编程非常陌生,我到处都在读“使用方法更改全局变量不是很好的编码。使用很少的全局变量,绝对不要更改它们”。我似乎找不到一个很好的解释来解释为什么或者应该做什么 假设我想玩一个游戏。它具有变量health=100。现在我想这应该是一个全局变量,而不是在类/对象中,但这也意味着我需要通过如下操作来调整它: def minushealth(): global health health -= 20 我似乎真的无法理解这一点,也许这里有一些简单的事情我不知道。您可以将health作为
health=100
。现在我想这应该是一个全局变量,而不是在类/对象中,但这也意味着我需要通过如下操作来调整它:
def minushealth():
global health
health -= 20
我似乎真的无法理解这一点,也许这里有一些简单的事情我不知道。您可以将
health
作为函数的显式参数并从函数返回值:
def minus_health(health):
return health - 20
然后在调用时指定返回值:
health = minus_health(health)
更好的是,使用可选的第二个参数来摆脱“幻数”:
def minus_health(health, amount=20):
return health - amount
请注意,您现在可以测试负健康状况
如下:
assert minus_health(100) == 80
然而,如果您使用global
,则必须执行以下操作:
health = 100
minus_health()
assert health == 80
在这个简单的示例中,这似乎不是一个大问题,但随着程序变得越来越复杂,您需要进行更多的设置和拆卸,而一个隔离良好的函数仍然可以在一行中有效地进行测试。您可以将
运行状况
作为函数的显式参数并从函数返回值:
def minus_health(health):
return health - 20
然后在调用时指定返回值:
health = minus_health(health)
更好的是,使用可选的第二个参数来摆脱“幻数”:
def minus_health(health, amount=20):
return health - amount
请注意,您现在可以测试负健康状况
如下:
assert minus_health(100) == 80
然而,如果您使用global
,则必须执行以下操作:
health = 100
minus_health()
assert health == 80
在这个简单的示例中,这似乎不是一个大问题,但随着程序变得越来越复杂,您需要进行更多的设置和拆卸,而一个隔离良好的函数仍然可以在一行中有效地进行测试。您可以将
运行状况
作为函数的显式参数并从函数返回值:
def minus_health(health):
return health - 20
然后在调用时指定返回值:
health = minus_health(health)
更好的是,使用可选的第二个参数来摆脱“幻数”:
def minus_health(health, amount=20):
return health - amount
请注意,您现在可以测试负健康状况
如下:
assert minus_health(100) == 80
然而,如果您使用global
,则必须执行以下操作:
health = 100
minus_health()
assert health == 80
在这个简单的示例中,这似乎不是一个大问题,但随着程序变得越来越复杂,您需要进行更多的设置和拆卸,而一个隔离良好的函数仍然可以在一行中有效地进行测试。您可以将
运行状况
作为函数的显式参数并从函数返回值:
def minus_health(health):
return health - 20
然后在调用时指定返回值:
health = minus_health(health)
更好的是,使用可选的第二个参数来摆脱“幻数”:
def minus_health(health, amount=20):
return health - amount
请注意,您现在可以测试负健康状况
如下:
assert minus_health(100) == 80
然而,如果您使用global
,则必须执行以下操作:
health = 100
minus_health()
assert health == 80
在这个简单的例子中,这似乎不是一个大问题,但随着程序变得越来越复杂,您需要进行更多的设置和拆卸,而一个隔离良好的函数仍然可以在一行中有效地进行测试。Jornsharpe的答案是正确的 但对于游戏类型的答案,最好使用类/属性解决方案,如下所示:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
负_健康状况会是什么样子:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
当然,如果健康度低于0等,这并没有考虑在内,但你应该知道。通过这种方式,所有“玩家”都可以拥有独立的健康属性。jonrsharpe的答案是正确的 但对于游戏类型的答案,最好使用类/属性解决方案,如下所示:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
负_健康状况会是什么样子:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
当然,如果健康度低于0等,这并没有考虑在内,但你应该知道。通过这种方式,所有“玩家”都可以拥有独立的健康属性。jonrsharpe的答案是正确的 但对于游戏类型的答案,最好使用类/属性解决方案,如下所示:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
负_健康状况会是什么样子:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
当然,如果健康度低于0等,这并没有考虑在内,但你应该知道。通过这种方式,所有“玩家”都可以拥有独立的健康属性。jonrsharpe的答案是正确的 但对于游戏类型的答案,最好使用类/属性解决方案,如下所示:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
负_健康状况会是什么样子:
player_object.minus_health()
class Player(object):
def __init__(self):
__health = 100
def minus_health(self):
self.__health -= 20
当然,如果健康度低于0等,这并没有考虑在内,但你应该知道。这种方式允许所有“玩家”拥有单独的健康属性。在另一个答案中显示的
Player
类可能就是您最终的结果,但只是对函数参数的解释,您只能修改可变参数。在指定的情况下,一种类似于Player
类但更简单的方法是在dict
中管理您的状态,然后将该dict传递到函数中以修改属性:
def minus_health(entity, amount=-20):
entity['health']+=amount
# Use like so
player = dict(name='John', health=100)
minus_health(player)
list
s和object
s也是可变的,它们的工作方式类似,即它们的内容可以在函数内部修改。在另一个答案中显示的Player
类可能就是您结束的地方,但只是对函数参数的解释,您只能修改可变的参数。在指定的情况下,一种类似于Player
类但更简单的方法是在dict
中管理您的状态,然后将该dict传递到函数中以修改属性:
def minus_health(entity, amount=-20):
entity['health']+=amount
# Use like so
player = dict(name='John', health=100)
minus_health(player)
list
s和object
s也是可变的,它们的工作方式类似,即它们的内容可以在函数内部修改。在另一个答案中显示的Player
类可能就是您结束的地方,但只是对函数参数的解释,您只能修改可变的参数。在您指定的情况下