47

可能重复:
在创建它们的函数之外的函数中使用全局变量

我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。

4

5 回答 5

37

以下是实现相同目的的两种方法:

使用参数和返回(推荐)

def other_function(parameter):
    return parameter + 5

def main_function():
    x = 10
    print(x)    
    x = other_function(x)
    print(x)

运行时main_function,您将获得以下输出

>>> 10
>>> 15

使用全局变量(永远不要这样做)

x = 0   # The initial value of x, with global scope

def other_function():
    global x
    x = x + 5

def main_function():
    print(x)    # Just printing - no need to declare global yet
    global x   # So we can change the global x
    x = 10
    print(x)
    other_function()
    print(x)

现在你会得到:

>>> 0    # Initial global value
>>> 10   # Now we've set it to 10 in `main_function()`
>>> 15   # Now we've added 5 in `other_function()`
于 2012-12-27T09:15:06.737 回答
15

只需在任何函数之外声明您的变量:

globalValue = 1

def f(x):
    print(globalValue + x)

如果您需要从函数内分配给全局,请使用以下global语句:

def f(x):
    global globalValue
    print(globalValue + x)
    globalValue += 1
于 2012-12-27T08:58:15.853 回答
13

如果您需要访问函数的内部状态,最好使用类。您可以通过将类实例设为可调用来使类实例表现得像函数,这是通过定义来完成的__call__

class StatefulFunction( object ):
    def __init__( self ):
        self.public_value = 'foo'

    def __call__( self ):
        return self.public_value


>> f = StatefulFunction()
>> f()
`foo`
>> f.public_value = 'bar'
>> f()
`bar`
于 2012-12-27T10:21:55.960 回答
7

使用全局变量也会让你的程序变得一团糟——我建议你尽量避免它们。也就是说,“global”是python中的一个关键字,因此您可以将特定变量指定为全局变量,如下所示:

def foo():
    global bar
    bar = 32

我应该提一下,使用“全局”关键字的情况极为罕见,因此我认真建议重新考虑您的设计。

于 2012-12-27T08:58:27.093 回答
5

您可以使用模块范围。假设您有一个名为的模块utils

f_value = 'foo'

def f():
    return f_value

f_value是一个模块属性,可以被导入它的任何其他模块修改。由于模块是单例的,因此从一个模块进行的任何更改utils都可以被导入它的所有其他模块访问:

>> import utils
>> utils.f()
'foo'
>> utils.f_value = 'bar'
>> utils.f()
'bar'

请注意,您可以按名称导入函数:

>> import utils
>> from utils import f
>> utils.f_value = 'bar'
>> f()
'bar'

但不是属性:

>> from utils import f, f_value
>> f_value = 'bar'
>> f()
'foo'

这是因为您将 module 属性引用的对象标记为f_value在本地范围内,然后将其重新绑定到 string bar,而函数f仍然引用 module 属性。

于 2012-12-27T10:30:32.300 回答