函式 (二) 命名空間與作用域

2022-07-04 04:27:11 字數 2549 閱讀 8452

我們寫一段**,裡面肯定會定義一些變數名,函式名,而一旦我們執行**,python直譯器在載入這些**的時候,會在記憶體中開闢一片空間專門用來存放這些名字以及這些名字所繫結的值的關係,

這塊記憶體就被稱為命名空間。

△內建命名空間

內建命名空間是用來存放python直譯器的一些內建方法明以及變數名的。這些名稱是在直譯器啟動的時候就載入好的,我們隨時可以呼叫。比如常見的 print( )、input( )、len( )等都是內建方法,我們在寫**的時候直接呼叫就行。而存放他們的名字的地方就叫做內建命名空間。

△全域性命名空間

我們在寫一段**的時候,除了函式內所定義的變數以及函式外,其他的變數名以及函式名所存放的地方就叫做全域性命名空間。一旦我們定義好這個變數或者函式,那麼我們可以在**的任意地方呼叫。

△區域性命名空間

存放函式內定義的變數名以及函式內巢狀的函式名的地方叫做區域性命名空間。他們只能在函式內部(包括函式內巢狀的函式內部)被呼叫。

當我們開啟直譯器的時候內建變數以及函式就立即被載入,當我們執行一段**的時候,全域性變數以及函式才被載入,但是函式內部並不會被執行,只有在函式被呼叫的時候才會載入它內部的變數以及內嵌函式,所以,名稱的載入順序是:內建名稱---->全域性名稱---->區域性名稱

與名稱的載入順序剛好相反,python直譯器在用到乙個變數或者函式的時候,它會優先從區域性命名空間去查詢,如果沒有,再到全部命名空間去查詢,如果還沒有,才會去內建命名空間去查詢。

示例如下:

1 x =0

2def

input():

3 x = 1

4print

(x)5 input()

#大家都知道python內建的乙個方法叫做input( ),他是用來做使用者互動的,但是如果我們自己定義乙個input函式,

#那麼再呼叫 input( )這個方法的時候,它會先從全域性命名空間找input這個名字,如果找得到,那麼它就不會再去

#內建命名空間去呼叫內建的input()方法了。而這個我們自定義的input方法內部有乙個變數x,全域性裡還有乙個變

#量也叫x,這個時候我們在函式內部呼叫x,那麼直譯器就會先從區域性命名空間去找,很顯然,它能找到,那麼將不會再

#去全部或者內建命名空間裡去找了,所以最後列印的x的值為1

作用域就是作用範圍,按照生效範圍可以分為全域性作用域和區域性作用域。

全域性作用域:包含內建命名空間、全域性命名空間,在整個檔案的任意位置都能被引用、全域性有效

區域性作用域:區域性命名空間,只能在區域性範圍內生效

△global

雖然在區域性作用域內可以呼叫全域性作用域的變數,但是它是沒有許可權修改,如果非要修改,那麼就要用到global這個關鍵字了,如下:

1 a = 10

2def

func():

3global

a4 a = 2056

print

(a)  #呼叫函式之前a的值為10

7func()

8print(a)  #呼叫函式之後a的值就被修改為20了

nonlocal關鍵字是用來改變外部離自己最近的區域性變數

函式裡面可以巢狀另外乙個函式:

1 def

outer():

2 def

inner():

3 pass

滿足一下兩種情況的函式就成為閉包:

①有函式的巢狀

②內部函式呼叫外部函式的變數(不是指全域性變數)

如下:

1

defouter():

2 a = 1

3def

inner():

4print(a)

下面的例子是寫乙個簡單的爬網頁函式,將指定網頁的源**列印出來:

1

from urllib.request import

urlopen23

defget_url():

4 url = '

'5defget_html():

6 res =urlopen(url).read()

7print

(res)

8get_html()

9 get_url()

函式的命名空間與作用域

1 命名空間namespaces 存放名字與值繫結關係的地方 2 命名空間分為三大類 內建命名空間 作用 存放python直譯器自帶的名字 生命週期 在直譯器啟動時生效,在直譯器關閉時失效 全域性命名空間 作用 除了內建的與區域性的名字外,其餘都是全域性名字 生命週期 在檔案執行時生效,在檔案執行完...

命名空間與作用域

命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...

命名空間與作用域

定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...