我正在尝试从定义的变量中添加或减去,但如何用新值覆盖旧值?
a = 15
def test():
a = a + 10
print(a)
test()
错误信息:
Traceback (most recent call last):
File "test.py", line 7, in <module>
test()
File "test.py", line 4, in test
a = a +10
UnboundLocalError: local variable 'a' referenced before assignment
原文由 user7351337 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试运行代码时出现的错误是:
……从表面上看,这似乎很奇怪:毕竟,上面代码中的 第一 条语句 (
a = 15
) 是一个赋值。发生什么了?实际上,有两件截然不同的事情正在发生,除非您已经知道它们,否则它们都不是显而易见的。
首先,您实际上有两个不同的变量:
第一行中的
a
是一个全局变量(之所以这样称呼是因为它存在于全局范围内,在任何函数定义之外)。其他行中的
a
是一个局部变量,这意味着它只存在于你的test()
函数中。这两个变量彼此完全无关,即使它们具有相同的名称。
如果在该函数中有一个语句分配给它,则该变量是函数的局部变量 - 例如,您的
a = a +10
行。即便如此,错误仍然看起来很奇怪 - 毕竟,您在
test()
中做的第一件事就是分配给a
,那么如何预先引用它呢?答案是,在赋值语句中,Python 在将其分配给左侧的名称之前先评估
=
符号右侧的所有内容——因此即使赋值首先 写入 您的代码a
在右侧首先被 _引用_:a +10
。有两种方法可以解决这个问题。首先是告诉 Python 你真的希望
a
里面的test()
a
:这会起作用,但这是一种非常糟糕的编写程序的方法。更改函数内部的全局变量很难真正快速地管理,因为您通常有很多函数,而且它们中没有一个可以确定另一个函数不会以他们不期望的方式弄乱全局变量。
更好的方法是将变量作为参数传递给函数,如下所示:
请注意,名称不必相同——你对
test()
的新定义只是说它接受一个值,然后用它做一些事情。您可以传入任何您喜欢的东西——它可以是a
或数字7
或其他。事实上,如果您尝试避免在不同范围内使用同名变量,您的代码总是会更容易理解。如果你玩上面的代码,你会注意到一些有趣的事情:
…
a
没变! That’s because although you passed it intotest()
and it got assigned tox
, it was thenx
that got changed, leaving the originala
一个人。如果你想真正改变
a
,你需要返回你修改后的x
从函数中,然后将它重新分配回a
在外面: