Python - Decorator(装饰器) - Cell和Free Variable

本文探讨Python装饰器与闭包的关系,重点解析Cell和自由变量(Free Variable)的概念。自由变量不在局部、非局部、全局或内置作用域中,Python通过Cell来间接引用。文中通过示例解释了为何需要Cell,并介绍了如何检查函数是否包含Cell和自由变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谈到装饰器(decorator),离不开闭包(closure)!

谈到闭包(closure),离不开Cell和Free Variable!

只要理解了Cell和Free Variable,那才算是真正地理解了闭包和装饰器!

什么是Cell和Free Variable

我们先来看Free Variable。我们知道Python的变量(variable)都是在某个作用域中的。这4个作用域你一定了解,local, nonlocal, global(module) 和 built-in。某个变量名在作用域中的查找顺序这里就不赘述了。我们可以说local variable, global variable等等。那free variable又是怎么回事呢?

Free Variable中的“Free”就是自由的意思。自由变量,说明这个变量不是属于之前提到的4个作用域中,它很“自由”。那Python又是怎么去引用它的呢?

Python是通过Cell间接引用Free Variable。

此处你一定有个疑问,为什么得通过Cell间接引用Free Variable?为什么不直接引用Free Variable?

那我们就看看闭包直接引用自由变量有什么问题。

如下图,如果只有一个闭包在引用自由变量,而且自由变量是属于不可改变(immutable)的类型,那我们必须得先创建一个值,然后再修改闭包中的引用地址去引用新值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值