如何在不在每个函数中键入`global`的情况下创建全局变量?

时间:2017-04-24 19:32:08

标签: python

我试图创建一个全局变量,但据我所知,你需要键入" global"在每个职能中。

这个例子在Python 2.7中:

a = 10

def change():
    global a
    a = 2
    print a

def reverse():
    global a
    a = 10
    print a

// Output:
// 2
// 4

我尝试重新创建上面的代码而不使用global我要创建的每个函数中的每个变量。有更好的方法吗?

为了更好地解释这种情况,我有一本字典,我打算在其上使用许多不同的功能。问题是,我不想每次都使用function(dict)do_this(dict),我更喜欢function()do_this()。我的想法是,如果dict是全球性的,我可以解决这个问题。

P.S 谢谢你的所有答案!不完全是我想要的,但我很欣赏答案。

2 个答案:

答案 0 :(得分:1)

class Globo(object):
    pass


def change():
    Globo.a = 2
    print Globo.a

答案 1 :(得分:1)

如果您只想阅读变量(而不是修改它),则不需要global行。见官方FAQ。但是,如果您真的想绕开此规则,则可以创建全局字典(或列表或其他可变数据结构)并将全局变量放在那里。然后你可以通过全局字典操作它们:

a = 4
globs = dict(g1=3)


def print_a():
    print(a)  # not modifying, so you don't need `global`
    globs['g1'] += 1  # technically not modifying globs either.
    print(globs)

print_a() # 4 \n {'g1', 4}
print(globs) # {'g1', 4}

为什么这样做? (我将在这里解释我所知道的最好的,但如果你知道的话,请随时编辑)。替换"修改"与"重新分配"在你的脑海里。当您更改a(例如a += 1)的值时,您实际上会重新分配a,因此Python不会让您失望。当您在globs中更改值时,您实际上并未将任何内容重新分配给名称globs,因此它可以让您。一个可以帮助您的链接:

在没有声明global的情况下,您无法在函数中执行的操作是将箭头从全局命名空间更改为指向其他内容。