Python 包装函数中变量的使用

前言

最近python学习到了包装函数,说真的,这部分内容一开始真的有点难理解。

问题

遇到一道很简单的练习题:(附上代码)
利用闭包返回一个计数器函数,每次调用它返回递增整数

def createCounter():
    ans = [0]
    def counter():
        ans[0] += 1
        return ans[0]
    return counter

一开始,我是这样写的:

def createCounter():
    n = 0
    def counter():
        n = n + 1
        return n
    return counter

结果报错了,琢磨了好久,发现原来内层函数只可以调用外层函数中定义的变量,但不能对其进行更改(内层函数对于外层函数中的变量只有读权限,没有写权限)。如果想要更改,系统会认为要更改的是内层函数中一个相同名字的变量(内层函数中可以使用一个与外层函数中名字完全相同的变量),所以在counter内创立一个新的变量n,而这个变量n没有初始化,因此报错了。

解决方法

看了别人的分析之后,收集了三种解决方法:
1.将x定义为global,全局命名空间在任何一个位置都有读写权限,但问题是在任何地方都可以对其修改。

def createCounter():
    global x
    x=0
    def counter():
        global x
        x += 1
        return x
    return counte

2.将外层函数中的x定义为list。在内层使用x[0]+=1时,list的指向不会发生变化,变化的是list内部的元素。

def createCounter():
    x = [0]
    def counter():
        x[0] += 1
        return x[0]
    return counter

3.设置一个指向可变对象list的默认参数。思路与2一样,只要参数一直等于默认参数,就会始终指向同一个list的地址,变化的是list内部的元素。

def createCounter():
    def counter(x=[0]):
        x[0] = x[0]+1
        return x[0]
    return counter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值