03-03 闭包独立状态
题目
写一个创建编号器的函数,参数为起始编号。第一份从 1 开始,第二份从 100 开始;交错调用,应得到 1、100、2、101,两份状态互不修改。
推导与做法
每调用一次 make_counter,都会建立一份独立的外层局部变量 value。返回的 next_number 通过闭包继续访问这份变量,nonlocal 让加一写回外层绑定。
| 调用 | 第一份下一编号 | 第二份下一编号 | 返回 |
|---|---|---|---|
| first() | 2 | 100 | 1 |
| second() | 2 | 101 | 100 |
| first() | 3 | 101 | 2 |
| second() | 3 | 102 | 101 |
过程图
%% 每个节点保留输入、执行位置或执行后的实际状态。
flowchart TD
S0["make_counter(1):独立 value=1"]
S1["first() 返回1,自己的 value变2"]
S0 --> S1
S2["second() 返回100,另一份 value变101"]
S1 --> S2
S3["再交错调用:2、101"]
S2 --> S3
classDef default fill:#EEF0FB,stroke:#4657B5,color:#24324A
linkStyle default stroke:#4657B5
实现与运行
查看带注释实现。本题与相关处理函数放在同一章节代码文件中;启动工具负责定位相邻项目和选择题号。
在配套目录的 函数与模块/reading_project 中运行。
# 使用项目解释器运行本题,题号决定执行哪一组演示。
python "../../学习索引/参考实现/代码/ch03.py" 03-03
程序按题号输出处理后的值、查询结果或状态。先和前面的手算比较,再修改一项输入重跑。
查看本题运行结果
# 与上面的手算状态和题目数值逐项比较。
[
1,
100,
2,
101
]