變數的有效範圍分為區域變數和全域變數:
在一個涵式中所使用的變數稱為區域變數,它的作用範圍只有在該涵式內部,所以不同的涵式中可以有相同名稱的變數,它們在各自的涵式中互不干擾。當涵式執行完畢,區域變數所占有的記憶體空間也會被釋放。以下看看區域變數的範例
def f1():
x = 5 #區域變數
y = 6 #f1()中的y跟f2()的y不相干
print(x+y)
def f2():
y = 1
print(x+y) #錯誤! 不能取到x值(區域)
f1()
f2()
因為x為f1()的區域變數,所以f2()會用不到,它們兩變數皆是互不相干的。
在所有涵式外定義的變數為全域變數。他可以用在主程式中,也能在各涵式中作使用。那麼我們把剛剛的x拉到外面去,如此x會成為全域變數,程式也能夠順利執行。如下:
x = 5 #全域變數
def f1():
y = 6
print(x+y)
def f2():
y = 1
print(x+y)
f1()
f2()
雖然目前看來全域變數很方便,但程式中使用過多全域變數會使涵式間的耦合變得緊密,喪失涵式的獨立性。
x = 'outside' #全域變數
y = 'global'
def f():
x = 'inside' #覆蓋掉
print(x)
print(y)
f()
print(x)
>>>
inside
global
outside
>>>
由於在函式中對全域變數進行設定值運算,或改變全域變數值,皆會發生錯誤,如:
a = 'abc'
def d():
b = a
a = 10 #改變全域變數,錯誤
a = a+'inside' #右方a不存在,錯誤
print(a)
d()
print(a)
所以為了要告知函式某變數為全域變數,可以使用global敘述:
a = 'abc'
def d():
global a #宣告a為全域變數
a = a+'inside'
print(a)
d()
>>>
abc inside
>>>
還有最後想提的是,如果不使用全域變數的話要如何將函式中的區域變數資料傳遞到外面?
以下有兩種方法:
#f1()變數x作為參數傳給f2()
def f1():
x = 5
y = 6
f2(x)
print(x+y)
def f2(z):
y = 1
print(z+y)
f1()
#f1()變數x作為參數傳給f2()
def f1():
x = 5
y = 6
print(x+y)
return x
def f2():
y = 1
print(f1()+y)
f2()
好像有點小錯誤唷~
a = 'abc'
def d():
b = a # ... local variable 'a' referenced before assignment
a = 10 # 如果沒有上一行,這裡其實不會錯誤
a = a+'inside' # ...unsupported operand type(s) for +: 'int' and 'str'
print(a)
d()
print(a)