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。