UnbondLocalError: local variable referenced before assigment

来源:互联网 发布:怎么加盟淘宝网店 编辑:程序博客网 时间:2024/06/09 14:29
<span style="font-size:18px;"></span><pre name="code" class="python">y,z = 1,2def change():      y = y+2      z = z+2      retrun y,z

  这段代码是想改变全局变量y,z的值,看起来没什么问题,y,z在函数外面声明了,实际运行起来会报 UnbondLocalError错。

        这是因为python变量名解析原则:LEGB原则。当在函数中使用未认证的变量名时,python搜索4个作用域[本地作用域(L),之后是上一层结构中def或lambda的本地作用域(E),之后是全局作用域(G),最后是内置作用域(B)],并且在第一次能够找到这个变量名的地方停下来。

        当给变量名‘y’赋值为‘y+2’时,python先在函数内部(即本地变量)中找'y+2'中的y是否在函数中定义了,然后才在全局变量中查找y的定义。当python先查找本地变量的时候,它找到了变量名y,但y却没有定义,故即便我们定义了全局变量y,依然会报错。有几种修改方法可避免这个错误。

(1)将y,z声明为全局变量

   

<span style="font-size:18px;">y,z = 1,2def change():      global y,z         #加入这一行      y = y+2      z = z+2      retrun y,z</span>
           这样就不会再报错了,当赋值的时候,python查到了变量名y,但y是全局变量,不是本地变量,所以python在函数中没有查找到y的定义,所以它会从全局变量中查找y,这就得到了我们想要的结果

     

(2)将y,z的定义放在函数里面

   

def change():      y,z = 1,2      y = y+2      z = z+2      retrun y,z

    python在函数内查找到了y,z的定义,就不会报错了。但是却没有改变y,z的值,当函数运行结束之后,y,z对象也就不存在了


   


      


0 0
原创粉丝点击