-------‘’存放名字與值的關係」的空間python
代碼在運行伊始,建立的存儲「變量名與值的關係」的空間叫作全局命名空間;app
在函數的運行中開闢的臨時的空間叫作局部命名空間。函數
命名空間一共分爲三種:ui
全局命名空間spa
局部命名空間code
內置命名空間blog
*內置命名空間中存放了python解釋器爲咱們提供的名字:input,print,str,list,tuple...它們都是咱們熟悉的,拿過來就能夠用的方法。作用域
三種命名空間之間的加載與取值順序:字符串
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)input
取值順序:
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
綜上所述,在找尋變量時,從小範圍,一層一層到大範圍去找尋。
全局 name='oldzhang' def func(): print(name) func() #oldzhang
局部 name='oldzhang' def func(): name='oldwang' print(name) func() #oldwang
內置 def len(x): return x print(len([1,2,3])) #[1, 2, 3]
做用域
做用域就是做用範圍,按照生效範圍能夠分爲全局做用域和局部做用域。
全局做用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
局部做用域:局部名稱空間,只能在局部範圍內生效
#先從局部做用域找,而後再從全局做用域找
#print(globals()) #print(locals()) def func(): a = 12 b = 20 print(locals()) print(globals()) func() ''' {'b': 20, 'a': 12} {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000212A588>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python10/day10/test1.py', '__cached__': None, 'func': <function func at 0x0000000001D03E18>} '''
global:
1,聲明一個全局變量。
2,在局部做用域想要對全局做用域的全局變量進行修改時,須要用到 global(限於字符串,數字)。 #字符串、數字不可變
def func(): global a a = 3 func() print(a) count = 1 def search(): global count count = 2 search() print(count)
ps:對可變數據類型(list,dict,set)能夠直接引用不用經過global。
li = [1,2,3] dic = {'a':'b'} def change(): li.append('a') dic['q'] = 'g' print(dic) print(li) change() print(li) print(dic)
nonlocal: #python3以後纔有,以前沒有
1,不能修改全局變量。
2,在局部做用域中,對父級做用域(或者更外層做用域非全局做用域)的變量進行引用和修改,而且引用的哪層,從那層及如下此變量所有發生改變。
1 def add_b(): 2 b = 42 3 def do_global(): 4 b = 10 5 print(b) 6 def dd_nonlocal(): 7 nonlocal b 8 b = b + 20 9 print(b) 10 dd_nonlocal() 11 print(b) 12 do_global() 13 print(b) 14 add_b()
函數的嵌套調用
局部函數找全局函數可以找到而且執行。
全局不能找到局部函數內的嵌套函數。若是要執行嵌套函數須要對齊嵌套的函數寫下函數才能順利執行。
def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 # max4(23,-7,31,11) 函數的嵌套調用
函數的嵌套定義
def f1(): print("in f1") def f2(): print("in f2") f2() f1() ########### def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1()
函數的做用域鏈:小範圍做用域能夠使用大範圍的變量,可是反之不行,他是單向的。
def f1(): a = 1 def f2(): def f3(): print(a) f3() f2() f1() ################ def f1(): a = 1 def f2(): a = 2 f2() print('a in f1 : ',a) f1()