Python变量名与作用域的坑

首页 > 西方诗歌 > 文章

Python变量名与作用域的坑

小伙伴提到,如果将withcli_ctxasdut这个block删除掉,代码执行正常。 听到这里,我的第一反应是变量作用域的问题,但是也无法道出其中原委,于是建议我的小伙伴,将contextmanager那一段代码改成withcli_ctxasd,重新尝试一下是否有问题,同时我在网上继续搜索相关的原因,之后由结果和理论结合分析问题的原因。 幸运的是,代码修改以后,执行正常,我也找到了一些文章来解释这个问题,我的第一感觉也没有错,的确是变量作用域的问题,代码在执行过程中,printdut实际上是在访问Localvariable,而不是我们期望的globalvariabledut。 参考Python的官方文档和搜索到的资料,总结出具体原因如下:当搜索一个变量的时候,先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,就会在全局变量中找这个变量,如果找不到抛出异常Unbound-LocalError。

如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改,那么python会认为它是一个局部变量。

因为对变量的定义在代码块以外,当前代码块中没有变量的定义和赋值,所以报错。 在我们的代码中,全局变量dut虽然创建了,但是由于在函数代码块中,下文中有contextmanagercli_ctx对变量dut进行了赋值操作,导致在函数block中,dut成为了局部变量,而非全局变量。 对变量赋值的操作“=”是很明显的语句,其他不是那么明显的赋值操作有:for循环中的赋值,except语句中的赋值,with...as...{var}中的var。 总结:避免误入一些不必要的坑,基础知识一定要学扎实!。