總結(jié):
- 內(nèi)部函數(shù),不修改全局變量可以訪問(wèn)全局變量
- 內(nèi)部函數(shù),修改同名全局變量,則python會(huì)認(rèn)為它是一個(gè)局部變量
- 在內(nèi)部函數(shù)修改同名全局變量之前調(diào)用變量名稱(如print sum),則引發(fā)Unbound-LocalError
在程序中設(shè)置的 sum 屬于全局變量,而在函數(shù)中沒(méi)有 sum 的定義,根據(jù)python訪問(wèn)局部變量和全局變量的規(guī)則:當(dāng)搜索一個(gè)變量的時(shí)候,python先從局部作用域開(kāi)始搜索,如果在局部作用域沒(méi)有找到那個(gè)變量,那樣python就在全局變量中找這個(gè)變量,如果找不到拋出異常(NAMEERROR或者Unbound-LocalError,這取決于python版本。)
如果內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對(duì)這個(gè)變量有修改.那么python會(huì)認(rèn)為它是一個(gè)局部變量,又因?yàn)楹瘮?shù)中沒(méi)有sum的定義和賦值,所以報(bào)錯(cuò)。
從下面兩個(gè)程序看單獨(dú)的訪問(wèn)或者修改全局變量,并不報(bào)錯(cuò)~
訪問(wèn)全局變量:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b print sum #僅僅訪問(wèn) add(4,8) print sum
輸出結(jié)果為:
4 8 5 5
修改同名的全局變量,則認(rèn)為是一個(gè)局部變量:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b #內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對(duì)這個(gè)變量有修改.那么python會(huì)認(rèn)為它是一個(gè)局部變量 sum=b+a #在函數(shù)內(nèi)部修改 print sum add(4,8)
輸出結(jié)果為:
4 8 12
下面的程序就會(huì)因?yàn)?#8221;如果內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對(duì)這個(gè)變量有修改。那么 python 會(huì)認(rèn)為它是一個(gè)局部變量,又因?yàn)楹瘮?shù)中沒(méi)有 sum 的定義和賦值,所以報(bào)錯(cuò):
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys sum=5 def add(a=1,b=3): print a,b print sum #內(nèi)部函數(shù)引用同名變量,并且修改這個(gè)變量。python會(huì)認(rèn)為它是局部變量。因?yàn)樵诖颂巔rint之前,沒(méi)有定義sum變量,所以會(huì)報(bào)錯(cuò)(建議與情況一比較,備注:此處只是比上例先print sum) sum=b+a print sum add(4,8) print sum
報(bào)錯(cuò)信息:
4 8 Traceback (most recent call last): ... ... ... UnboundLocalError: local variable 'sum' referenced before assignment
遇到在程序中訪問(wèn)全局變量并且要修改全局變量的值的情況可以使用: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