【问题标题】: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

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

【问题讨论】:

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

标签: python function global-variables local


【解决方案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语句,但是我需要的是全局变量的当前值,它在函数中。
      • 您的请求似乎没有意义。全局变量的当前值在全局变量中。也许您可以展示您的代码以方便理解。
      • 不,该函数应该更改变量并返回其值并更新全局变量,但我似乎不能这样做
      猜你喜欢
      • 2022-08-02
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多