總結:
內部函式,不修改全域性變數可以訪問全域性變數
內部函式,修改同名全域性變數,則python會認為它是乙個區域性變數
在內部函式修改同名全域性變數之前呼叫變數名稱(如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
printsum #僅僅訪問
add(4,8)
printsum
[root@rac3python]# python local.py
48
5
5#修改同名的全域性變數,則認為是乙個區域性變數
#!/usr/bin/python
importsys
sum=5
defadd(a=1,b=3):
printa,b
#內部函式有引用外部函式的同名變數或者全域性變數,並且對這個變數有修改.那麼python會認為它是乙個區域性變數
sum=b+a #在函式內部修改
printsum
add(4,8)
print sum
[root@rac3python]# python local.py
4 8
12
5
下面的程式就會因為「如果內部函式有引用外部函式的同名變數或者全域性變數,並且對這個變數有修改.那麼python會認為它是乙個區域性變數,又因為函式中沒有sum的定義和賦值,所以報錯
#!/usr/bin/python
importsys
sum=5
defadd(a=1,b=3):
printa,b
printsum #內部函式引用同名變數,並且修改這個變數。python會認為它是區域性變數。因為在此處print之前,沒有定義sum變數,所以會報錯(建議與情況一比較,備註:此處只是比上例先print sum)
sum=b+a
printsum
add(4,8)
printsum
[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
區域性與全域性變數
區域性變數和全域性變數 一.區域性變數 1 在乙個函式內部定義的變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的。include using namespace std float add float x,float y intmain 2 形參屬於...
區域性變數與全域性變數
根據c語言的說法,區域性變數 定義在方法內部的變數叫區域性變數 全域性變數 定義在方法外部的變數叫全域性變數。區域性變數和全域性變數的主要區別在於二者的生存週期不同。全域性變數的生存週期 靜態分配記憶體,程式執行期間常駐記憶體,直到程式執行結束。區域性變數的生存週期 動態分配記憶體,位於執行緒堆疊中...
全域性變數與區域性變數
區域性變數 在區域性 塊內定義 作用域在區域性 塊內,生命週期在區域性 塊內,結束時銷毀。include void test int main return 0 輸出 1111111111 全域性變數 在所有 塊外定義 作用域是整個工程,生命週期程式開始至結束。工程test 10 10 原始檔sum...