python中变量作用域规则以及闭包
1. 变量作用域规则
Python在编译函数的定义体时,如果某个函数体外的变量在定义体中被赋值了,会判断它是局部变量。
要想在函数赋值后仍将其解释成全局变量,需要使用global声明。
b = 6
def f3(a):
global b # 未用global声明之前b被解释为局部变量
print(a)
print(b)
b = 9
2. 闭包
什么是闭包?
闭包也是一种函数,能够保留在函数体中出现的自由变量的绑定。
自由变量:未在本地作用域中绑定的变量
闭包的作用举例
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total / len(series)
return averager
说明:series由于是averager函数体外绑定的变量,它会保存在函数对象的__code__属性中
如果自由变量是不可变对象,情况就变了。
def make_averager():
count = 0
total = 0
def averager(new_value):
count += 1
total += new_value
return total / count
return averager
说明:count和total在averager函数中被重新赋值,相当于隐式的创建了局部变量count和total,这样,count和total就不再自由变量了,函数执行会报错。为了解决这个问题,要加上nonlocal声明,将变量标记为自由变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构