为何Python函数未局部定义变量也未传参,运行却不报错?
Python函数变量作用域问题解答
关键:读取变量和赋值变量的作用域规则不一样
Python查找变量遵循LEGB顺序(局部→嵌套→全局→内置),但核心区别在这:
- 仅读取变量:函数内部没定义的话,会自动向上查找外层作用域的同名变量
- 对变量赋值:Python会直接把这个变量标记为当前函数的局部变量,哪怕全局有同名的
第一段代码报错的原因
看这段代码:
def demo(): print(a) a += 5 a = 100 print(a) demo() print(a)
a += 5本质是赋值操作(等同于a = a + 5),Python一看到这个,就认定demo里的a是局部变量。但执行print(a)的时候,局部的a还没被赋值(赋值在print之后),所以会抛出UnboundLocalError,提示局部变量在赋值前被引用。
第二段代码正常运行的原因
再看这段代码:
def demo(): print(a) a = 100 print(a) demo() print(a)
函数里只有print(a),这是纯读取操作,没有任何赋值行为。Python会按照作用域规则向上查找,在全局作用域找到a = 100,直接使用这个值,自然不会报错,所以输出三次100。
补充:想在函数里修改全局变量怎么办?
如果要在函数内部修改全局变量,得用global关键字声明:
def demo(): global a print(a) a += 5 a = 100 print(a) demo() print(a)
这样运行后输出就是100、100、105,因为global a告诉Python,函数里的a就是全局作用域的那个变量,不是新的局部变量。
内容的提问来源于stack exchange,提问作者CodeSpec
相关产品推荐
相关产品推荐

