Python變量作用域(一)


在一個程序中使用變量名時,Python創建、改變或者查找變量名都是在所謂的命名空間中進行的。作用域指的就是命名空間。

Python中的變量名在第一次賦值時已經創建,並且必須經過賦值后才能夠使用。由於變量名最初沒有聲明,Python將一個變量名

被賦值的地點關聯為一個特定的命名空間。也即是說,在代碼中給一個變量賦值的地方決定了這個變量將存在於哪個命名空間,也

就是它可見的范圍。

函數除了打包代碼之外,還為程序增加了一個額外的命名空間曾:在默認的情況下,一個函數的所有變量名都是與函數的命名空間

相關聯的。這意味着:1、一個在def內定義的變量名能夠被def內的代碼使用。不能在函數的外部引用這樣的變量名。

2、def之中的變量名與def之外的變量名並不沖突,即使是使用在別處的相同的變量名。一個在def之外被賦值的變量X與在這個def

之中的賦值的變量X是完全不同的變量。

 

函數定義了本地作用域,而模塊定義的是全局作用域。這兩個作用域有如下的關系:

1、內嵌的模塊是全局作用域。每個模塊都是一個全局作用域。對於外部的全局變量就成為一個模塊對象的屬性,但是在一個模塊中能夠

像簡單的變量一樣使用。

2、全局作用域的作用范圍僅限於單個文件。這里的全局指的是在一個文件的頂層的變量名僅對於這個文件內部的代碼而言是全局的。

3、每次對函數的調用都創建了一個新的本地作用域。即是說,將會存在由那個函數創建的變量的命名空間。可以認為每一個def語句都定

義了一個新的本地作用域,但是因為Python允許函數在循環中調用自身,所以從技術上講,本地作用域實際上對應的是函數的調用。換句話

說,每一個函數調用都創建了一個新的本地命名空間。遞歸在處理不能提前預知的流程結構時是一個有用工具。

4、賦值的變量名除非聲明為全局變量或非本地變量,否則均為本地變量。

5、所有其他的變量名都可以歸納為本地、全局或者內置的。

變量名解析遵循的原則:LEGB原則

1、當在函數中使用未認證的變量名時,Python搜索4個作用域【本地作用域(L),之后是上一層結構中def或lambda的本地作用域(E),

之后是全局作用域(G)、最后是內置作用域(B)】並且在第一處能夠找到這個變量名的地方停下來。如果沒有搜索到變量名,Python會報錯。

2、當在函數中給一個變量名賦值時,Python總是創建或改變本地作用域的變量名,除非它已經在哪個函數中聲明為全局變量。

3、當在函數之外給一個變量名賦值時,本地作用域與全局作用域是相同的。

 

全局變量的總結:

1、全局變量是位於模塊內部的頂層的變量名

2、全局變量如果是在函數內部賦值的話,必須經過聲明

3、全局變量在函數內部不經過聲明也可以使用

根據要求的對象,工廠函數有時候也稱作閉合,即一個能夠記住嵌套作用域的變量值的函數,即使那個作用域已經不存在了。工廠函數有時用於需要

及時生成事件處理,實時對不同情況進行反饋的程序中。例如:

 1 def maker(N):
 2     def action(X):
 3         return  X**N
 4     return action
 5 
 6 
 7 f = maker(2)
 8 f(3)
 9 運行結果:9
10 f(4)
11 運行結果:16
12 
13 f = maker(3)
14 f(3)
15 運行結果:27
16 f(4):
17 運行結果:64

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM