zoukankan      html  css  js  c++  java
  • 全局变量报错:UnboundLocalError: local variable 'l' referenced before assignment

    总结:
    1. 内部函数,不修改全局变量可以访问全局变量
    2. 内部函数,修改同名全局变量,则python会认为它是一个局部变量
    3. 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
    在程序中设置的sum属于全局变量,而在函数中没有sum的定义,根据python访问局部变量和全局变量的规则:当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样python就在全局变量中找这个变量,如果找不到抛出异常(NAMEERROR或者Unbound-LocalError,这取决于python版本。)

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

    从下面两个程序看单独的访问或者修改全局变量,并不报错~

    #访问全局变量
    #!/usr/bin/python
    importsys
    sum=5
    defadd(a=1,b=3):
        printa,b
        print sum  #仅仅访问 
    add(4,8)
    printsum
    [root@rac3python]# python local.py
    48
    5
    5

    #修改同名的全局变量,则认为是一个局部变量
    #!/usr/bin/python
    importsys
    sum=5
    defadd(a=1,b=3):
        print a,b
             #内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量
        sum=b+a #在函数内部修改
        print sum
    add(4,8)
    [root@rac3python]# python local.py
    4 8
    12
    下面的程序就会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有sum的定义和赋值,所以报错
    #!/usr/bin/python
    import sys
    sum=5
    defadd(a=1,b=3):
        print a,b
        printsum  #内部函数引用同名变量,并且修改这个变量。python会认为它是局部变量。因为在此处print之前,没有定义sum变量,所以会报错(建议与情况一比较,备注:此处只是比上例先print sum)
        sum=b+a
        printsum
    add(4,8)
    print sum
    [root@rac3python]# python local.py
    48
    Traceback(mostrecentcalllast):
     File"local.py",line10,in?
       add(4,8)
     File"local.py",line6,inadd
       printsum
    UnboundLocalError:localvariable'sum'referencedbeforeassignment

    遇到在程序中访问全局变量并且要修改全局变量的值的情况可以使用:global关键字,在函数中声明此变量是全局变量
    #!/usr/bin/python
    importsys
    sum=5
    print'改变之前:sum=',sum
    defadd(a=1,b=3):
        globalsum
        print'add 函数中:sum=',sum
        sum=b+a
        print'函数中改变之后:sum= ',sum
    add(4,8)
    print'改变之后 sum=',sum
    [root@rac3python]# vim local.py
    改变之前:sum=5
    add函数中:sum=5
    函数中改变之后:sum= 12
    改变之后sum=12

     转自 http://blog.csdn.net/my2010sam/article/details/17735159

  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/perfei/p/5507617.html
Copyright © 2011-2022 走看看