總結:
- 內部函數,不修改全局變量可以訪問全局變量
- 內部函數,修改同名全局變量,則python會認為它是一個局部變量
- 在內部函數修改同名全局變量之前調用變量名稱(如print sum),則引發Unbound-LocalError
在程序中設置的 sum 屬於全局變量,而在函數中沒有 sum 的定義,根據python訪問局部變量和全局變量的規則:當搜索一個變量的時候,python先從局部作用域開始搜索,如果在局部作用域沒有找到那個變量,那樣python就在全局變量中找這個變量,如果找不到拋出異常(NAMEERROR或者Unbound-LocalError,這取決於python版本。)
如果內部函數有引用外部函數的同名變量或者全局變量,並且對這個變量有修改.那麼python會認為它是一個局部變量,又因為函數中沒有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
輸出結果為:
4 8
5
5
修改同名的全局變量,則認為是一個局部變量:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
def add(a=1,b=3):
print a,b
#內部函數有引用外部函數的同名變量或者全局變量,並且對這個變量有修改.那麼python會認為它是一個局部變量
sum=b+a #在函數內部修改
print sum
add(4,8)
輸出結果為:
4 8
12
下面的程序就會因為"如果內部函數有引用外部函數的同名變量或者全局變量,並且對這個變量有修改。那麼 python 會認為它是一個局部變量,又因為函數中沒有 sum 的定義和賦值,所以報錯:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
def add(a=1,b=3):
print a,b
print sum #內部函數引用同名變量,並且修改這個變量。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 關鍵字,在函數中聲明此變量是全局變量。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sum=5
print '改變之前:sum=',sum
def add(a=1,b=3):
global sum
print 'add 函數中:sum=',sum
sum=b+a
print '函數中改變之後:sum= ',sum
add(4,8)
print '改變之後 sum=',sum
輸出結果為:
改變之前:sum= 5
add 函數中:sum= 5
函數中改變之後:sum= 12
改變之後 sum= 12
閱讀更多 程序員小新人學習 的文章