无法修改全局整数,但可以修改列表。怎么做?

4 投票
2 回答
826 浏览
提问于 2025-04-16 00:52

我定义了一个空的列表叫做 LISTL,还有一个变量 VAR1,初始值是0。然后我写了一个函数 foo(),这个函数的作用是把 VAR1 的值加1,并返回这个新的值。

当我调用 foo() 的时候,出现了一个错误:

UnboundLocalError: local variable 'VAR1' referenced before assignment

不过,考虑一下这个列表 LISTL

>>> def foo(x):
...     LISTL.append(x)
...     return LISTL
... 
>>> foo(5)
[5]

对这个列表的操作是正常的。我的问题是,为什么对列表的添加操作可以成功,而我却不能改变整数的值呢?

另外,这样在Python中声明全局变量是对的吗?(是在导入语句之后)

2 个回答

4

如果你在一个函数里给一个变量赋值,那么这个变量默认是局部的,也就是说它只能在这个函数里面使用。除非你特别声明它是global,这样它才能在整个程序中都能用。

5

这个差异的原因跟Python是如何管理名字的空间有关。如果你在一个函数定义里面(比如说def foo():),当你想要使用一个名字(比如VAR1LISTL)时,Python会先在你当前的函数内部找这个名字,如果找不到,它就会去函数所在的模块里找,最后再到全局范围去找,直到找到这个名字,或者找不到为止。

不过,使用名字和给名字赋值是两个不同的概念。如果你在函数内部写VAR1 = 2,这其实是在函数内部声明了一个新的变量,名字也是VAR1。这样做是有道理的,因为如果没有这样的名字空间管理,你可能会遇到各种名字冲突的问题。

当你往一个列表里添加内容时,你只是访问了这个列表,然后调用了一个方法来改变它的值。而当你使用+=时,你实际上是在给一个名字赋值。

如果你想要在当前的名字空间之外给名字赋值,你可以使用global关键字。在这种情况下,在你的函数内部,你需要先写global VAR1,这样VAR1就会指向外部的名字空间,任何对它的赋值都会在函数外部生效。

撰写回答