如何使局部变量(在函数内部)全局



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

这是实现同一件事的两种方法:

使用参数并返回(推荐)

def other_function(parameter):
    return parameter + 5
def main_function():
    x = 10
    print(x)    
    x = other_function(x)
    print(x)

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

>>> 10
>>> 15

使用Globals(永远不要执行此操作)

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()`

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

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

如果您需要从功能内部的全局分配,请使用global语句:

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

如果您需要访问函数的内部状态,则使用类可能更好。您可以通过使其成为可召唤来使类实例像函数一样行为,这是通过定义__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`

使用Globals也会使您的程序变得混乱 - 我建议您非常努力地避免它们。也就是说,"全球"是Python中的一个关键字,因此您可以将特定变量指定为全局,例如:

def foo():
    global bar
    bar = 32

我应该提到,使用"全局"关键字极为罕见,因此我认真建议重新思考您的设计。

您可以使用模块范围。假设您有一个名为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'

这是因为您将模块属性引用的对象标记为本地范围中的f_value,但是然后将其重新插入字符串bar,而该函数f仍在引用模块属性。

<</p> <</p> <</p> <</p> <</p> <</p>

相关内容

  • 没有找到相关文章

最新更新