什麼是命名空間
每一個 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