如何使局部变量(在函数内部)全局[重复]

Posted

技术标签:

【中文标题】如何使局部变量(在函数内部)全局[重复]【英文标题】:How to make a local variable (inside a function) global [duplicate] 【发布时间】:2012-12-12 16:19:39 【问题描述】:

可能重复:Using global variables in a function other than the one that created them

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

【问题讨论】:

如果您使用函数,但将它们的变量设为全局变量,那么您实际上并没有获得太多 ;-) “我使用函数是为了让我的程序不会一团糟”,所以不要重构你的代码你不会需要它们。 不,我不会将它们的所有变量都设为全局变量,可能只是一些。 那又怎样?仍然没有必要也没有好处。使用返回值和参数。 你能给我们一个简短的例子来说明你将如何使用全局值吗? (编辑您的问题)我们或许可以提出更好的方法。 【参考方案1】:

这里有两种方法可以达到同样的目的:

使用参数和返回(推荐)

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

【讨论】:

等一下,第一个示例中的 other_function() 是如何获得 10 的值的?您没有为其参数赋值,因此它无法知道该值为 5。 @HwangYouJin 原值为10。您将具有值10 的变量x 传递给other_function。这就像给机器喂食。你给机器一块面包(在这种情况下是x)。你想做吐司。你给它一个面包。现在机器有了面包,所以它可以使用面包了。我认为您应该提出更多问题以消除您的困惑。 @HwangYouJin 我们用x = 10 将x 设置为10。然后我们运行other_function(x),这意味着我们将x (10) 的值传递给other_function。在other_function 中,参数称为parameter,而不是x,但它的值仍然是10。在other_function 中,我们返回parameter + 5,即10 + 5 = 15! 啊...好吧...我已经注意到你在调用 other_function() 之前给了 x 它的值...对不起。无论如何,如何将函数返回的值转换为变量,或者说,如何给变量一个值,即函数返回的值? @HwangYouJin 就像variable = function(parameter) 一样简单。这将运行函数,传递参数,并接收返回值并将其放入变量中。如果您正在构建一个计算器,您可以使用 result = add(5, 6),而 result 现在等于 11。(假设 add(x,y): return x+y【参考方案2】:

您可以使用模块范围。假设您有一个名为 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仍然引用模块属性.

【讨论】:

【参考方案3】:

如果您需要访问函数的内部状态,最好使用类。你可以通过定义__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`

【讨论】:

【参考方案4】:

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

def foo():
    global bar
    bar = 32

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

【讨论】:

我只使用了一个全局变量,因为我的许多函数共享它,我不想分配代码行来更新每个函数中的每个变量。【参考方案5】:

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

globalValue = 1

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

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

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

【讨论】:

我已经使用了global语句,但是我需要的是全局变量的当前值,它在函数中。 您的请求似乎没有意义。全局变量的当前值在全局变量中。也许您可以展示您的代码以方便理解。 不,该函数应该更改变量并返回其值并更新全局变量,但我似乎不能这样做

以上是关于如何使局部变量(在函数内部)全局[重复]的主要内容,如果未能解决你的问题,请参考以下文章

什么是全局变量

自动化测试时需要使用python,请问如何理解python中的全局变量和局部变量?

局部变量和全局变量

局部变量

局部变量 与 全局变量

Python-函数的全局变量和局部变量