我对编程很陌生并且我一直在阅读“使用方法来改变全局变量并不是很好的编码。使用非常少的全局变量并且绝对不会改变它们”。我似乎无法找到一个很好的解释为什么或应该做什么。
让我们说我想要某种游戏。它有变量health=100
。现在我认为这应该是一个全局变量而不是在一个类/对象中,但这也意味着我需要通过执行以下操作来调整它等等:
def minushealth():
global health
health -= 20
我似乎无法弄清楚这一点,也许这里有一些我不知道的简单。
答案 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)
list
和object
s也是可变的,并且可以以类似的方式工作,即它们的内容可以在函数内修改。