为何看似全局的yep类在main函数作用域内未定义且报unboundLocal错误
问题原因
这是Python静态作用域规则导致的典型问题:
Python在编译函数main的阶段,会扫描整个函数内的所有赋值操作,只要某个名称出现在赋值符号左侧,就会被标记为当前函数的局部变量,整个函数作用域内访问该名称都会优先找局部变量,哪怕赋值操作出现在访问操作之后。
你的main函数中写了yep = yep(args.yep).yep,yep出现在了赋值符号左侧,因此Python判定yep是main的局部变量,执行赋值语句时会先计算右侧的yep(args.yep),此时局部变量yep还没有被赋值,就会抛出UnboundLocalError,和全局定义的yep类无关,本质是变量重名冲突。
修复方案
方案1(推荐):修改局部变量名,避免和全局类名冲突
将main函数里的局部变量改成其他名称即可:
def main(args): yep_result = yep(args.yep).yep return yep_result
方案2(不推荐):显式声明使用全局变量
如果一定要保留yep作为局部变量名,可以用global关键字显式声明该名称指向全局作用域的变量:
def main(args): global yep yep = yep(args.yep).yep return yep
该方案会大幅降低代码可读性,后续维护极容易再次踩同名变量的坑,仅作原理演示不建议实际使用。
内容的提问来源于stack exchange,提问作者pyeR_biz
相关产品推荐
相关产品推荐

