关于python:python-如何使局部变量(在函数内部)成为全局变量

Python - How to make a local variable (inside a function) global

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Using global variables in a function other than the one that created them

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


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

使用参数和返回(推荐)

1
2
3
4
5
6
7
8
def other_function(parameter):
    return parameter + 5

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

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

1
2
>>> 10
>>> 15

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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

现在您将获得:

1
2
3
>>> 0    # Initial global value
>>> 10   # Now we've set it to 10 in `main_function()`
>>> 15   # Now we've added 5 in `other_function()`


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

1
2
3
4
globalValue = 1

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

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

1
2
3
4
def f(x):
    global globalValue
    print(globalValue + x)
    globalValue += 1


如果需要访问函数的内部状态,最好使用类。通过使类实例成为可调用的函数,可以使其行为类似于函数,这可以通过定义__call__来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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`

使用Globals也会让你的程序一团糟-我建议你尽量避免使用Globals。也就是说,"global"是python中的一个关键字,因此可以将特定变量指定为全局变量,如:

1
2
3
def foo():
    global bar
    bar = 32

我应该提到,使用"global"关键字是非常罕见的,所以我认真地建议重新考虑您的设计。


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

1
2
3
4
f_value = 'foo'

def f():
    return f_value

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

1
2
3
4
5
6
>> import utils
>> utils.f()
'foo'
>> utils.f_value = 'bar'
>> utils.f()
'bar'

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

1
2
3
4
5
>> import utils
>> from utils import f
>> utils.f_value = 'bar'
>> f()
'bar'

但不是属性:

1
2
3
4
>> from utils import f, f_value
>> f_value = 'bar'
>> f()
'foo'

这是因为您在本地作用域中将module属性引用的对象标记为f_value,然后将其重新绑定到字符串bar,而函数f仍引用module属性。