Python局部与非局部作用域疑问:三段代码输出差异解惑
Python作用域问题解析
核心规则:函数内局部变量的判定逻辑
只要函数内部存在对变量的赋值操作(比如a = 2),Python在编译函数代码时就会将该变量标记为局部变量,后续函数内对这个变量的所有引用都会优先指向这个局部变量,而非全局变量——哪怕赋值语句出现在引用之后。
示例1分析
a = 10 def myfunc(): a = 2 print(a) print(a) myfunc()
- 全局作用域的
a = 10是全局变量,外层print(a)直接输出全局值10。 - 进入
myfunc后,a = 2创建了局部变量a,后续print(a)引用的是已赋值的局部变量,因此输出2。
示例2分析
a = 10 def myfunc(): print(a) print(a) myfunc()
myfunc内部没有对a的赋值操作,Python会按LEGB规则(局部→嵌套→全局→内置)向上查找,找到全局作用域的a = 10,因此两次输出都是10。
示例3与示例1的核心差异
a = 10 def myfunc(): print(a) a = 2 print(a) myfunc()
- 虽然
print(a)写在a = 2前面,但Python编译myfunc时,发现函数内存在a = 2的赋值操作,直接将a标记为局部变量。 - 执行
print(a)时,局部变量a还未被赋值,因此抛出UnboundLocalError。这就是和示例1的区别:示例1中print(a)在局部变量赋值之后,而示例3中print(a)在局部变量赋值之前,但函数已将a判定为局部变量,无法再引用全局的a。
如果想让示例3输出10和2,可以用global关键字声明a为全局变量:
a = 10 def myfunc(): global a print(a) a = 2 print(a) myfunc()
内容的提问来源于stack exchange,提问作者Aditi Garg
相关产品推荐
相关产品推荐

