Python函数没有定义参数也能运行?背后原理是什么?
运行原理说明
这是Python的变量作用域查找规则导致的,Python访问变量时会遵循LEGB规则,按如下优先级从高到低查找变量:
- 局部作用域:当前函数内部定义的变量/参数
- 嵌套作用域:外层嵌套函数的作用域(仅存在嵌套函数的场景)
- 全局作用域:当前py文件(模块)顶层定义的变量
- 内置作用域:Python预定义的内置名称(如
int、len等)
你定义的sum函数内部没有声明x、y变量,也没有外层嵌套函数,所以执行函数时会自动向上查找全局作用域的变量。而你在调用sum()之前已经在全局作用域定义了x=10、y=20,因此函数可以正常读取到这两个值完成计算,不会报错。
如果调整代码顺序,在定义x、y之前调用sum(),就会触发未定义变量的报错,示例如下:
def sum(): return x + y # 此时x、y还未定义,调用会报错 print("Total: ", sum()) x = 10 y = 20
运行后会抛出NameError: name 'x' is not defined错误。
最佳实践说明
你最初的认知是更合理的编码规范:函数依赖的变量尽量通过参数传入,避免依赖全局变量。依赖全局变量的函数行为会受外部环境影响,只要全局的x、y被其他代码修改,函数的返回结果就会随之变化,增加排查问题的成本。更推荐的写法如下:
def sum(x, y): return x + y print("Total: ", sum(10, 20))
这种写法下函数的行为完全由传入的参数决定,可维护性和可读性都更高。
内容的提问来源于stack exchange,提问作者DummyPerson
相关产品推荐
相关产品推荐

