Python函数与命名空间疑问:不同嵌套下变量访问结果为何不同?
Python函数与命名空间:两个示例的运行差异解析
你困惑的核心是Python的变量查找规则和函数定义位置带来的命名空间差异,直接看两个示例的区别:
示例1:全局定义的函数
def f1(): a = 1 f2() def f2(): print(a) a = 0 f1()
运行输出0,原因是:
- f2是全局函数,它的命名空间和f1的局部命名空间完全独立
- 当f2执行
print(a)时,Python按「局部→闭包→全局→内置」的顺序找变量:- f2自己的局部空间没有a
- f2没有嵌套在其他函数里,跳过闭包层
- 找到全局空间中定义的
a = 0,所以输出0
- f1里的
a = 1是f1的局部变量,f2根本访问不到这个命名空间的内容
示例2:嵌套定义的闭包函数
def f1(): a = 1 def f2(): print(a) f2() a = 0 f1()
运行输出1,原因是:
- f2是嵌套在f1内部的函数(闭包),它会绑定外层函数f1的局部命名空间
- 当f2执行
print(a)时,变量查找顺序:- f2自己的局部空间没有a
- 直接找到外层f1的局部空间里的
a = 1,所以输出1 - 这一步已经找到变量,不会再去全局空间查找
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

