无法修改全局整数,但可以修改列表。怎么做?
我定义了一个空的列表叫做
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():
),当你想要使用一个名字(比如VAR1
或LISTL
)时,Python会先在你当前的函数内部找这个名字,如果找不到,它就会去函数所在的模块里找,最后再到全局范围去找,直到找到这个名字,或者找不到为止。
不过,使用名字和给名字赋值是两个不同的概念。如果你在函数内部写VAR1 = 2
,这其实是在函数内部声明了一个新的变量,名字也是VAR1
。这样做是有道理的,因为如果没有这样的名字空间管理,你可能会遇到各种名字冲突的问题。
当你往一个列表里添加内容时,你只是访问了这个列表,然后调用了一个方法来改变它的值。而当你使用+=
时,你实际上是在给一个名字赋值。
如果你想要在当前的名字空间之外给名字赋值,你可以使用global
关键字。在这种情况下,在你的函数内部,你需要先写global VAR1
,这样VAR1
就会指向外部的名字空间,任何对它的赋值都会在函数外部生效。