Python之函數--命名空間、做用域、global、nonlocal、函數的嵌套和做用域鏈

命名空間

      -------‘’存放名字與值的關係」的空間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關鍵字,nonlocal關鍵字

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()
相關文章
相關標籤/搜索