iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0
自我挑戰組

Python 30天學習日誌系列 第 15

Day15-函式間的資料聯繫

  • 分享至 

  • xImage
  •  

區域變數和全域變數

變數的有效範圍分為區域變數和全域變數:

  • 區域變數:定義在一個涵式中的變數,其有效範圍是該涵式內。
  • 全域變數:定義在涵式外的變數,其有效範圍是整個Python檔案。
  1. 區域變數

在一個涵式中所使用的變數稱為區域變數,它的作用範圍只有在該涵式內部,所以不同的涵式中可以有相同名稱的變數,它們在各自的涵式中互不干擾。當涵式執行完畢,區域變數所占有的記憶體空間也會被釋放。以下看看區域變數的範例

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()會用不到,它們兩變數皆是互不相干的。

  1. 全域變數

在所有涵式外定義的變數為全域變數。他可以用在主程式中,也能在各涵式中作使用。那麼我們把剛剛的x拉到外面去,如此x會成為全域變數,程式也能夠順利執行。如下:

x = 5         #全域變數
def f1():
    y = 6         
    print(x+y)
def f2():
    y = 1
    print(x+y)    

f1()
f2()

雖然目前看來全域變數很方便,但程式中使用過多全域變數會使涵式間的耦合變得緊密,喪失涵式的獨立性。

  1. 全域區域的關係
    如果涵式中定義的區域變數與全域變數名稱相同,則區域變數會隱藏全域變數。如下:
x = 'outside'       #全域變數
y = 'global'
def f():
    x = 'inside'    #覆蓋掉
    print(x)
    print(y)

f()
print(x)

>>>
inside
global
outside
>>>
  1. 用global宣告全域變數

由於在函式中對全域變數進行設定值運算,或改變全域變數值,皆會發生錯誤,如:

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()

參考資料

  • 書名-輕鬆學Python3 /孫宏明-編著
  • 書名-大數據起步從Python開始 /吳萍-編著

上一篇
Day14-函式參數
下一篇
Day16-Lambda函式
系列文
Python 30天學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fongyi
iT邦新手 5 級 ‧ 2019-12-04 19:51:38

好像有點小錯誤唷~

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)

我要留言

立即登入留言