【Python】闭包

引入:

通过全局变量account_amount来记录余额

并定义函数进行取款存款操作,代码如下:

python 复制代码
account_amount = 0
def atm(num, deposit = True):
    global account_amount
    if deposit:
        account_amount += num
        print(f"存款:+{num},账户余额:{account_amount}")
    else:
        account_amount -= num
        print(f"取款:-{num},账户余额:{account_amount}")

atm(300)
atm(300)
atm(100, False)

运行结果:

复制代码
存款:+300,账户余额:300
存款:+300,账户余额:600
取款:-100,账户余额:500

尽管功能实现是OK的,但是仍有问题:

  • 代码在命名空间上(变量定义)不够干净、整洁
  • 全局变量有被修改的风险

如何解决?

  • 将变量定义在函数内部是行不通的
  • 我们需要使用闭包

我们先来看一个闭包的简单示例:

python 复制代码
def outer(logo):
    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")
    return inner

fn1 = outer("编程语言")
fn1("Python")
fn1("Java")
fn1("C++")

fn2 = outer("前端")
fn2("HTML")
fn2("CSS")
fn2("JavaScript")

运行结果:

复制代码
<编程语言>Python<编程语言>
<编程语言>Java<编程语言>
<编程语言>C++<编程语言>
<前端>HTML<前端>
<前端>CSS<前端>
<前端>JavaScript<前端>

定义双层嵌套函数,内层函数可以访问外层函数的变量

将内层函数作为外层函数的返回,此内层函数就是闭包函数

如果我们想修改外部函数的值呢?

使用nonlocal关键字

示例:

python 复制代码
def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    return inner

fn = outer(10)
fn(5)
fn(3)
fn(1)

要对num1进行修改,需要用nonlocal对其进行修饰

运行结果:

复制代码
15
18
19

我们回过头来对一开始的代码进行优化:

python 复制代码
def account_create(initial_amount = 0):
    def atm(num, deposit =True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款:+{num},账户余额:{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款:-{num},账户余额:{initial_amount}")
    return atm

fn = account_create()
fn(300)
fn(300)
fn(100,False)

优点:

  • 无需定义全局变量即可实现:通过函数持续地访问、修改某个值
  • 闭包使用的变量的作用域在函数内,难以被错误的调用修改

缺点:

  • 由于内部函数持续引用外部函数的值,会导致这一部分内存空间不被释放,一直占用内存
相关推荐
czhc11400756631 分钟前
Linux 76 rsync
linux·运维·python
软件黑马王子26 分钟前
C#系统学习第八章——字符串
开发语言·学习·c#
阿蒙Amon27 分钟前
C#读写文件:多种方式详解
开发语言·数据库·c#
悠悠小茉莉32 分钟前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
Da_秀36 分钟前
软件工程中耦合度
开发语言·后端·架构·软件工程
Fireworkitte42 分钟前
Java 中导出包含多个 Sheet 的 Excel 文件
java·开发语言·excel
m0_625686551 小时前
day53
python
Real_man1 小时前
告别 requirements.txt,拥抱 pyproject.toml和uv的现代Python工作流
python
站大爷IP2 小时前
Python文件操作的"保险箱":with语句深度实战指南
python
运器1232 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程