Python 有没有更简单的方法来更改和使用全局变量?
如果在函数之前声明全局变量,并尝试在函数中更改该变量,则会返回错误:Python 有没有更简单的方法来更改和使用全局变量?,python,global-variables,Python,Global Variables,如果在函数之前声明全局变量,并尝试在函数中更改该变量,则会返回错误: james = 100 def runthis(): james += 5 这行不通 除非在函数中再次声明全局变量,如下所示: james = 100 def runthis(): global james james += 5 有没有更简单的方法来更改函数中的变量?一次又一次地重新声明变量有点混乱和烦人。避免在函数中使用全局变量不是更简单吗 james = 100 def runthis(v
james = 100
def runthis():
james += 5
这行不通
除非在函数中再次声明全局变量,如下所示:
james = 100
def runthis():
global james
james += 5
有没有更简单的方法来更改函数中的变量?一次又一次地重新声明变量有点混乱和烦人。避免在函数中使用全局变量不是更简单吗
james = 100
def runthis(value):
return value + 5
james = runthis(james)
如果您有很多,将它们放在单个可变容器中可能更有意义,例如字典:
def runthis(scores):
scores['james'] += 5
players = {'james': 100, 'sue': 42}
runthis(players)
print players # -> {'james': 105, 'sue': 42}
如果您不喜欢分数['james']
符号,您可以创建一个专门的dict
类:
# from http://stackoverflow.com/a/15109345/355230
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
def runthis(scores):
scores.james += 5 # note use of dot + attribute name
players = AttrDict({'james': 100, 'sue': 42})
runthis(players)
print players # -> {'james': 105, 'sue': 42}
避免在函数中使用全局变量不是更简单吗
james = 100
def runthis(value):
return value + 5
james = runthis(james)
如果您有很多,将它们放在单个可变容器中可能更有意义,例如字典:
def runthis(scores):
scores['james'] += 5
players = {'james': 100, 'sue': 42}
runthis(players)
print players # -> {'james': 105, 'sue': 42}
如果您不喜欢分数['james']
符号,您可以创建一个专门的dict
类:
# from http://stackoverflow.com/a/15109345/355230
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
def runthis(scores):
scores.james += 5 # note use of dot + attribute name
players = AttrDict({'james': 100, 'sue': 42})
runthis(players)
print players # -> {'james': 105, 'sue': 42}
在Python中修改全局变量是很难看的。如果需要维护状态,请使用: 或者,如果需要在所有实例之间共享
james
,请将其设置为类属性:
class MyClass(object):
james = 100
def runThis(self):
MyClass.james += 5
它可能并不简单,但肯定更像Python。在Python中修改全局变量是很难看的。如果需要维护状态,请使用: 或者,如果需要在所有实例之间共享
james
,请将其设置为类属性:
class MyClass(object):
james = 100
def runThis(self):
MyClass.james += 5
它可能并不简单,但肯定更像python。
global x
似乎是一种将变量声明为全局变量的非常简单的方法。你认为一个更简单的方法会是什么样子?也就是说,全局变量应该是一种罕见的需要。我几乎从不使用global
键盘。你可以将james
称为globals()['james']
Sven Mrnach,在我需要这个帮助的情况下,我发现自己必须不断地在多个函数中更改全局变量,这有点痛苦。@user3579419好吧,我想说的是——不要这样做。全局状态是邪恶的,使用大量全局状态会导致无法维护和不稳定的代码。在这里的一些评论中解释这一点有点困难,但这是每个有经验的程序员都可以证实的。如果它能阻止使用全局变量,那就更好了。global x
似乎是一种将变量声明为全局变量的非常简单的方法。你认为一个更简单的方法会是什么样子?也就是说,全局变量应该是一种罕见的需要。我几乎从不使用global
键盘。你可以将james
称为globals()['james']
Sven Mrnach,在我需要这个帮助的情况下,我发现自己必须不断地在多个函数中更改全局变量,这有点痛苦。@user3579419好吧,我想说的是——不要这样做。全局状态是邪恶的,使用大量全局状态会导致无法维护和不稳定的代码。在这里的一些评论中解释这一点有点困难,但这是每个有经验的程序员都能证实的。如果它能阻止使用globals,那就更好了。是的,但在我使用大量代码的情况下,在一个函数中放入这么多参数可能会变得很麻烦。是的,但在我处理大量代码的情况下,在一个函数中放入这么多参数可能会变得很麻烦。天才,我从来没有想过,但这是一个很好的解决方案。所以谢谢:DGlad你对课堂解决方案很满意。实际上,对于其他人来说,最好不要使用globals。见下面的@martineau。天才,我从来没有想过,但这是一个伟大的解决方案。所以谢谢:DGlad你对课堂解决方案很满意。实际上,对于其他人来说,最好不要使用globals。见下文@martineau。