是否有更简单的方法来更改和使用全局变量?

时间:2015-01-19 23:57:25

标签: python global-variables

如果在函数之前声明一个全局变量并尝试在函数中更改这些变量,则会抛出错误:

james = 100

def runthis():
    james += 5

这不会奏效。

除非你在函数中再次声明全局变量,否则:

james = 100

def runthis():
    global james
    james += 5

是否有更简单的方法来更改函数内部的变量?它一次又一次地重新声明变量,这是一种混乱而烦人的事情。

2 个答案:

答案 0 :(得分:3)

避免在函数中使用全局变量不是更简单吗?

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}

如果您不喜欢scores['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}

答案 1 :(得分:2)

修改全局变量在Python中很难看。如果您需要维护状态,请使用class

class MyClass(object):
    def __init__(self):
        self.james = 100
    def runThis(self):
        self.james += 5

或者,如果您需要在所有实例之间共享james,请将其设为类属性:

class MyClass(object):
    james = 100
    def runThis(self):
        MyClass.james += 5

它可能并不简单,但它肯定更加pythonic。