總結(jié):
- 內(nèi)部函數(shù),不修改全局變量可以訪問全局變量
- 內(nèi)部函數(shù),修改同名全局變量,則python會認為它是一個局部變量
- 在內(nèi)部函數(shù)修改同名全局變量之前調(diào)用變量名稱(如print sum),則引發(fā)Unbound-LocalError
在程序中設(shè)置的 sum 屬于全局變量,而在函數(shù)中沒有 sum 的定義,根據(jù)python訪問局部變量和全局變量的規(guī)則:當搜索一個變量的時候,python先從局部作用域開始搜索,如果在局部作用域沒有找到那個變量,那樣python就在全局變量中找這個變量,如果找不到拋出異常(NAMEERROR或者Unbound-LocalError,這取決于python版本。)
如果內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對這個變量有修改.那么python會認為它是一個局部變量,又因為函數(shù)中沒有sum的定義和賦值,所以報錯。
從下面兩個程序看單獨的訪問或者修改全局變量,并不報錯~
訪問全局變量:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b print sum #僅僅訪問 add(4,8) print sum
輸出結(jié)果為:
4 8 5 5
修改同名的全局變量,則認為是一個局部變量:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b #內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對這個變量有修改.那么python會認為它是一個局部變量 sum=b+a #在函數(shù)內(nèi)部修改 print sum add(4,8)
輸出結(jié)果為:
4 8 12
下面的程序就會因為”如果內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對這個變量有修改。那么 python 會認為它是一個局部變量,又因為函數(shù)中沒有 sum 的定義和賦值,所以報錯:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b print sum #內(nèi)部函數(shù)引用同名變量,并且修改這個變量。python會認為它是局部變量。因為在此處print之前,沒有定義sum變量,所以會報錯(建議與情況一比較,備注:此處只是比上例先print sum) sum=b+a print sum add(4,8) print sum
報錯信息:
4 8 Traceback (most recent call last): ... ... ... UnboundLocalError: local variable 'sum' referenced before assignment
遇到在程序中訪問全局變量并且要修改全局變量的值的情況可以使用:global 關(guān)鍵字,在函數(shù)中聲明此變量是全局變量。
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 print '改變之前:sum=',sum def add(a=1,b=3): global sum print 'add 函數(shù)中:sum=',sum sum=b+a print '函數(shù)中改變之后:sum= ',sum add(4,8) print '改變之后 sum=',sum
輸出結(jié)果為:
改變之前:sum= 5 add 函數(shù)中:sum= 5 函數(shù)中改變之后:sum= 12 改變之后 sum= 12
原文地址:https://blog.csdn.net/my2010sam/article/details/17735159