Python --闭包详解

一、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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值