什麼是命名空間
每一個 function or class 等等都有定義自己的命名空間。
假如你在 fun1( ) 有一個 variable 叫做 X,又在 fun2( ) 裡面有個 variable 也叫做 X,
雖然名稱一樣,但是他們對應的卻是不一樣的東西,而且也不跨界使用。
來看看例子:1def print_animal():2 animal = 'cat'3 print(animal)45def print_cat():6 print(animal)78if __name__ =='__main__':9 print_animal()10 print_cat()11---------------執行結果---------------12line 6, in print_cat13 print(animal)14NameError: 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 ,並且更改他
電腦會丟一個錯誤給你1animal = 'cat' #global variable23def print_animal():4 print('before print_animal:',animal)5 animal = 'dog'6 print('after_access: ',animal )78if __name__ =='__main__':9 print_animal()10 print('after print_animal: ',animal)11---------------執行結果---------------12in print_animal13 print('before print_animal:',animal)14UnboundLocalError: local variable 'animal' referenced before assignment
那如果寫成這樣呢?1animal = 'cat'2print('before print_animal: ',animal,id(animal))3def print_animal():4 animal = 'dog'5 print('after_access: ',animal,id(animal) )67if __name__ =='__main__':8 print_animal()9 print('after print_animal: ',animal, id(animal))10---------------執行結果---------------11before print_animal: cat 2659724812after_access: dog 2414275213after 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