全局變量報錯: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
import sys
sum= 5
def add(a= 1,b= 3):
     printa,b
     print sum  #僅僅訪問 
add( 4, 8)
printsum
[root @rac3python]# python local.py
4 8
5
5

#修改同名的全局變量,則認為是一個局部變量
#!/usr/bin/python
import sys
sum= 5
def add(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM