zoukankan      html  css  js  c++  java
  • 【Error】local variable 'xxx' referenced before assignment

    此种错误涉及到变量的作用域,即全局变量和局部变量的操作。

    总结如下:

    • 内部函数,不修改全局变量可以访问全局变量

    • 内部函数,修改同名全局变量,则python会认为它是一个局部变量

    • 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError

    在程序中设置的 sum 属于全局变量,而在函数中没有 sum 的定义,根据python访问局部变量和全局变量的规则:当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样 python 就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR或者Unbound-LocalError,这取决于python版本。)

    如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有sum的定义和赋值,所以报错。

    访问全局变量

    sum = 5
    def add(a=1,b=3):
        print a,b
        print sum #仅仅访问 
    >>add(4,8)
    >>print sum
    
    --------------
    >> 5
    >> 5
    

    修改同名的全局变量,则认为是局部变量

    sum=5
    def add(a=1,b=3):
        print a,b
    
    >>add(4, 8)
    >>4,8
    >>12
    

    修改同名的全局变量前已经引用则报错

    sum=5
    def add(a=1,b=3):
        print a,b
        print sum
        sum = a + b
        print sum
    
    >> add(4, 8)
    >> 报错。。。
    

    如何修改使其不报错呢,那就在修改全局变量之前使用全局关键字gloabal声明即可:global sum

  • 相关阅读:
    java学习6-java基础类库
    java学习5-面向对象(下)
    java学习4-面向对象(上)
    java学习3-流程控制与数组
    java学习2-数据类型和运算符
    pycharm(社区版2019.1版本)打开README.md文件卡死解决办法
    python深拷贝与浅拷贝的区别
    python中list切片详解
    python使用input().split()接收多个用户输入
    python学习-语言概述(一)
  • 原文地址:https://www.cnblogs.com/nju2014/p/5528072.html
Copyright © 2011-2022 走看看