```
a=1
def fun() :
a=a+1
print(a)
fun()
```
在执行这段代码时,会抛出 UnboundLocalError
异常,错误信息为 local variable 'a' referenced before assignment。这是因为在函数内部对变量 a
进行了赋值操作,建立了一个新的局部变量 a
,与全局变量 a
同名但是不同,覆盖了全局变量 a
的作用域。因此,在函数内部使用变量 a
时实际上是在访问局部变量 a
,而这个局部变量在函数定义中还没有被赋值,所以就会报错。
如果想在函数中修改全局变量 a
,可以在函数内部先声明 global a
,表示要使用的 a
是全局变量 a
,然后再进行修改。例如:
```
a = 1
def fun():
global a
a = a + 1
print(a)
fun() # 输出结果为:2
```
这里加入了语句 global a
,使得函数内部的操作不再创建一个新的局部变量 a
,而是直接修改全局变量 a
的值。这样就可以正常输出结果了。但需要注意,在大多数情况下,最好不要在函数内部使用全局变量,而是通过参数传递的方式将需要修改的变量传入函数,并将修改后的值返回。这样可以避免命名冲突和意外的变量覆盖等问题,也有利于代码的可读性和可维护性。
在 Python 中函数执行结束后,其局部变量将自动由系统回收。这种自动回收机制是通过 Python 的垃圾回收机制实现的。
具体来说,Python 使用一种叫做引用计数(Reference Counting)的技术来追踪内存中每个对象的引用次数。当一个对象不再被任何变量或数据结构所引用时,Python 将自动对该对象进行回收和释放内存操作。在函数执行结束后,如果其局部变量不再被其他变量所持有,那么 Python 将自动回收这些局部变量所占据的内存空间。
需要注意的是,Python 的垃圾回收机制并非总能及时回收所有无用的对象,特别是在处理循环引用等情况时可能存在问题。为了避免这种情况,Python 还提供了一种名为「分代回收」(Generational Garbage Collection)的机制,可以更加有效地回收内存空间。