已声明global b的情况下,为什么Python代码中第三个print输出为10?
Python代码执行结果原因解释
你提供的代码如下:
b=11 def outer(): b=10 print(b) def inner(): global b print(b) b=20 inner() print(b) outer() print(b)
核心原因
Python的变量作用域规则决定了三个位置的b属于不同的作用域:
- 代码最外层定义的
b是全局作用域变量 outer函数内部定义的b是outer的局部作用域变量,和全局b是完全独立的两个变量inner函数里用global b声明后,inner内部所有对b的操作都只会指向全局作用域的b,和outer的局部b没有任何关联
完整执行流程
- 调用
outer(),首先给outer的局部b赋值为10,第一个print(b)输出10 - 执行
inner():因为声明了global b,第一个print(b)读取全局b的初始值11并输出,随后把全局b的值修改为20,inner执行结束 - 回到
outer函数执行第三个print(b):此处访问的是outer自己的局部b,这个变量从来没有被修改过,值还是10,所以输出10 outer执行结束,最后一个print(b)读取已经被修改的全局b,输出20
补充说明
如果你需要让inner修改outer的局部变量b,只需要把inner里的global b改成nonlocal b即可,nonlocal关键字会让解释器找上一层嵌套函数的局部变量。
内容的提问来源于stack exchange,提问作者Tianyu He
相关产品推荐
相关产品推荐

