0%

Python 命名空間

什麼是命名空間

每一個 function or class 等等都有定義自己的命名空間。
假如你在 fun1( ) 有一個 variable 叫做 X,又在 fun2( ) 裡面有個 variable 也叫做 X,
雖然名稱一樣,但是他們對應的卻是不一樣的東西,而且也不跨界使用。
來看看例子:

1
def print_animal():
2
    animal = 'cat'
3
    print(animal)
4
5
def print_cat():
6
    print(animal)
7
8
if __name__ =='__main__':
9
    print_animal()
10
    print_cat()
11
---------------執行結果---------------
12
line 6, in print_cat
13
    print(animal)
14
NameError: name 'animal' is not defined

電腦會報錯!,因為 print_cat() 沒有定義 animal 這個 variable

Global Variable

程式主要部份是全域空間,在那裡命名的 variable 就叫做 global variable。

1
animal = 'cat'  #global variable
2
3
def print_animal():
4
    print('print_animal:',animal)
5
6
def print_cat():
7
    print('print_cat',animal)
8
9
if __name__ =='__main__':
10
    print_animal()
11
    print_cat()
12
---------------執行結果---------------
13
print_animal: cat
14
print_cat cat

這樣大家都可以取得 animal 的 value。

But!!! 如果想在 function 裡面取得 global variable 的 value ,並且更改他
電腦會丟一個錯誤給你

1
animal = 'cat'  #global variable
2
3
def print_animal():
4
    print('before print_animal:',animal)
5
    animal = 'dog'
6
    print('after_access: ',animal )
7
8
if __name__ =='__main__':
9
    print_animal()
10
    print('after print_animal: ',animal)
11
---------------執行結果---------------
12
in print_animal
13
    print('before print_animal:',animal)
14
UnboundLocalError: local variable 'animal' referenced before assignment

那如果寫成這樣呢?
1
animal = 'cat'
2
print('before print_animal: ',animal,id(animal))
3
def print_animal():
4
    animal = 'dog'
5
    print('after_access: ',animal,id(animal) )
6
7
if __name__ =='__main__':
8
    print_animal()
9
    print('after print_animal: ',animal, id(animal))
10
---------------執行結果---------------
11
before print_animal:  cat 26597248
12
after_access:  dog 24142752
13
after print_animal:  cat 26597248

是輸出了 dog 沒有錯,但是此時的 animal 已經是 local variable 了

那要怎麼存取 global variable 而不是變成 local variable?
我們使用 global key word

1
# -*- coding: utf-8 -*-
2
animal = 'cat'
3
print('before print_animal:',animal)
4
def print_animal():
5
    global animal  #不能寫成 global animal = 'dog'!
6
    animal = 'dog'
7
    print('after_access: ',animal )
8
9
if __name__ =='__main__':
10
    print_animal()
11
    print('after print_animal: ',animal)
12
---------------執行結果---------------
13
before print_animal: cat
14
after_access:  dog
15
after print_animal:  dog

這樣我們就可以自由存取 global variable

資料來源:

精通 Python:運用簡單的套件進行現代運算