如何从函数内部更改全局变量?
如何从函数内部更改全局变量?
这个问题在这里已经有了答案:
我正在尝试从定义的变量中添加或减去值,但是如何用新值覆盖旧值?
a = 15 def test(): a = a + 10 print(a) test()
错误消息:
Traceback (most recent call last): File "test.py", line 7, in test() File "test.py", line 4, in test a = a +10 UnboundLocalError: local variable 'a' referenced before assignment
当你尝试运行代码时,会得到以下错误:
UnboundLocalError: local variable 'a' referenced before assignment
看起来有点奇怪:毕竟,代码的第一条语句(a = 15
)是一个赋值语句。那么,到底发生了什么?
实际上,有两个不同的事情发生了,除非你已经知道,否则它们都不是很明显。
首先,你实际上有两个不同的变量:
-
第一行中的
a
是全局变量(因为它存在于全局范围内,不在任何函数定义之内)。 -
其他行中的
a
是局部变量,意味着它只存在于你的test()
函数内部。
尽管他们有相同的名称,但这两个变量是完全独立的。
如果函数内部有一个声明语句将变量赋值给它,则变量对于该函数是局部的 - 例如,你的a = a + 10
行。
即使如此,错误仍然看起来很奇怪 - 毕竟,在test()
内部的第一件事是将a
赋值,那么为什么会在引用之前出现错误?
答案是,在赋值语句中,Python在左边的名称之前评估右边的所有内容,然后将其赋值给等号左边的名称 - 因此,即使赋值在代码中首先写入,a
在右边的内容(a + 10
)中首先被引用。
有两种方法可以解决这个问题。第一种方法是告诉Python你真的希望test()
内部的a
是全局范围内相同的a
:
def test(): global a a = a + 10 print(a)
这样写程序是可行的,但并不是一种良好的方式。在函数内部改变全局变量会很快变得管理起来很困难,因为通常你有很多函数,并且没有一个函数能确定另一个函数不会以某种不期望的方式干扰全局变量。
更好的方法是将变量作为函数的参数传递,就像这样:
a = 15 def test(x): x = x + 10 print(x) test(a)
请注意,名称不一定相同-您对test()
的新定义只是表示它接受一个值,然后对该值进行操作。你可以传入任何东西-它可以是a
,或者数字7
,或其他什么。实际上,如果尝试避免在不同作用域中具有相同名称的变量,代码将始终更易于理解。
如果您使用上面的代码进行操作,您会注意到一些有趣的内容:
>>> a = 15 >>> test(a) 25 >>> a 15
…a
没有改变!这是因为虽然您将其传递到test()
中并将其分配给x
,但然后x
被改变,而原始的a
则保持不变。
如果您想实际更改a
,则需要从函数中返回修改后的x
,然后将其重新分配回a
:
>>> a = 15 >>> >>> def test(x): ... x = x + 10 ... print(x) ... return x ... >>> a = test(a) 25 >>> a 25