1. 程式人生 > >函數二----函數的進階

函數二----函數的進階

應該 fun 全局變量 內存地址 根據 內部 不可 可變 一個

一、命名空間(有三種)

  1.內置的命名空間 -----python解釋器

    就是python解釋器一啟動就可以使用的名字存儲再內置的命名空間中

    內置的名字在啟動解釋器的時候被加載進內存裏。

  2.全局命名空間 -----我們寫的代碼,但不是函數中的代碼

    是在程序從上到下被執行的過程中依次加載進內存的

    放置了我們設置的所有變量名和函數名

  3.局部命名空間 -----函數

    就是函數內部定義的名字

    當調用函數的時候,才會產生這個名稱空間,隨著函數執行的結束,這個命名空間就又消失了

 三種命名空間之間的加載順序:

   內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)

#在局部:可以使用全局、內置命名空間中的名字
#在全局:可以使用內置命名空間中的名字,但是不能用局部中命名空間中的名字
#在內置:不能使用全局、局部命名空間中的名字
def func():
    a = 1
func()
print(a)   #因為全局沒有a這個變量,它不可能去找func函數裏的這個a變量,所以會報錯
#在正常情況下,直接使用內置的名字
#當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字
#當我自己有的時候,我就不找我的上級要了
#如果自己沒有,就找上一級要,上一級沒有再找上一級,如果內置的名字空間都沒有,就報錯
#多個函數應該擁有多個獨立的局部命名空間,不互相共享
def input():
    print(in input now)

def func():
    # input = 1
    print(input)
func()    # <function input at 0x0000028967220378>  ---函數的內存地址()

#func  ---> 函數的內存地址
#函數名()  --->函數的調用
#函數的內存地址()   --->函數的調用

二、作用域

#全局作用域  ---作用在全局 ---內置和全局名字空間中的名字都屬於全局作用域---globals()
#局部作用域 --- 作用在局部 --- 函數(局部名字空間中的名字屬於局部作用域)---locals可以查看
a = 1
def func():
    return a
print(func())  # 1

a = 1
def func():
    global a
    a += 1
func()
print(a)  #2
func()
print(a)  #3

a = 1
def func(a):
    a = 2
    return a
a = func(a)
print(a)  #2
#對於不可變數據類型,在局部可以查看全局作用域中的變量,但是不能直接修改
#如果想要修改,需要在程序的一開始添加global聲明
#如果在一個局部(函數)內聲明了一個global變量,那麽這個變量在局部的所有操作將對全局變量有效
a = 1
b = 2
def func():
    x = aaa
    y = bbb
    print(locals())  # {‘x‘: ‘aaa‘, ‘y‘: ‘bbb‘}
    print(globals())

func()
print(globals())
print(locals())  #本地的,放在全局,全局就是本地;放在局部,局部就是本地
#globals  永遠打印全局的名字
#locals 輸出什麽,根據locals所在的位置

函數二----函數的進階