如何使局部变量(在函数内部)全局[重复]
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语句,但是我需要的是全局变量的当前值,它在函数中。 您的请求似乎没有意义。全局变量的当前值在全局变量中。也许您可以展示您的代码以方便理解。 不,该函数应该更改变量并返回其值并更新全局变量,但我似乎不能这样做以上是关于如何使局部变量(在函数内部)全局[重复]的主要内容,如果未能解决你的问题,请参考以下文章