一、Python变量作用域问题
time = 0 #-----全局变量 def insert_time(min): time = time + min #----局部变量 return time print(insert_time(2)) print(insert_time(10))
UnboundLocalError: local variable 'time' referenced before assignment
time为全局变量,函数中使用了该同名变量,且更改了该变量的值,导致代码在运行时,分不清time是全局变量还是局部变量,认为全局变量的话,函数体内部对全局变量进行了更改,认为是局部变量,函数体内部又没有对该变量进行定义就直接引用了
针对这样的问题,引入全局变量global和局部变量nonlocal
time = 0 #-----全局变量 def insert_time(min): global time time = time + min #----局部变量 return time print(insert_time(2)) print(insert_time(10)) print(time)
》》2 12
但是,全局变量global的使用存在弊端:全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量。
time = 0 #-----全局变量 def insert_time(min): nonlocal time time = time + min #----局部变量 return time print(insert_time(2)) print(insert_time(10)) print(time)
报错:SyntaxError: no binding for nonlocal 'time' found
函数中使用nonlocal定义time为局部变量,nonlocal关键字是能作用域局部变量,当使用nonlocal声明变量 time 时,就会往上最近一层局部作用域寻找局部变量 time ,结果没找着,上一层的time是全局变量,报错。
完善的方法:闭包--内部函数的局部作用域中可以访问外部函数局部作用域中变量的行为,避免使用全局变量
time = 0 #-----全局变量 def study_time(time): def insert_time(min): nonlocal time time = time + min #----局部变量 return time return insert_time f = study_time(time) print(f(2)) print(time) print(f(10)) print(time)
》》2 0 12 0
运行过程解析:
参考:https://blog.csdn.net/qq_41250801/article/details/84145353
https://www.readwithu.com/Article/PythonBasis/python15/1.html