一個(gè)變量的作用域或者其所屬的命名空間由該變量第一次被賦值的位置決定
Python中全局作用域就是模塊作用域,不存在一個(gè)變量可以直接跨好幾個(gè)模塊被調(diào)用的情況,我們要想訪問一個(gè)模塊中的變量,必須先import該模塊,通過該模塊訪問,所以在Python中說到全局,就等同于模塊
Python中的命名空間可以細(xì)分為四類:
1.非本地命名空間,當(dāng)在一個(gè)函數(shù)內(nèi)部又定義了一個(gè)函數(shù),則外圍的函數(shù)的命名空間相對于內(nèi)部的函數(shù)來說就是非本地命名空間,內(nèi)部的函數(shù)的命名空間是本地命名空間。因?yàn)橥鈬瘮?shù)的命名空間相對于內(nèi)部函數(shù)來說不是全局命名空間,所以我們稱它為非本地命名空間
2.本地命名空間,一般情況下使用def定義的函數(shù),其中的變量處于本地命名空間
3.全局命名空間,也就是在模塊頂層定義的變量位于全局命名空間
4.內(nèi)置命名空間,Python內(nèi)置的變量和方法都位于該命名空間還有一個(gè)知識(shí)點(diǎn)需要注意的是,我們在shell中使用python打開的交互式對話窗口,包括我們在這個(gè)窗口中定義的變量,函數(shù)等,也都位于一個(gè)全局命名空間,也就是位于一個(gè)模塊中,這個(gè)模塊的名字叫做
__main__,所以我們經(jīng)常在代碼中看到if __name__ == __main__-
在一個(gè)函數(shù)內(nèi)部進(jìn)行變量查找的遵循LEGB規(guī)則,
- 就是先查找Local也就是本地命名空間
2.如果沒有找到,再去非本地命名空間查找,也就是該函數(shù)的外圍函數(shù)去查找
3.如果還沒有找到,就是全局命名空間找,也就是模塊內(nèi)查找
4.如果還沒有找到,就去內(nèi)置命名空間內(nèi)查找
5.經(jīng)過以上四步還沒有找到的話,就報(bào)錯(cuò)了
- 就是先查找Local也就是本地命名空間
-
Python的四個(gè)命名空間查找規(guī)則可以用如下圖來展示
捕獲.PNG 舉個(gè)例子
x = 123
def fun():
x="abc"#這個(gè)改動(dòng)不會(huì)影響到全局的x
def fun1():
global x
x="abc"#這個(gè)改動(dòng)會(huì)影響到全局的x
- global和nonlocal語句是Python中唯一兩個(gè)看起來像是聲明的語句。由于變量可以直接被賦值并使用,所以我們都不會(huì)聲明一個(gè)變量,但是global可以聲明一個(gè)變量,聲明該變量為全局作用域,如下:
x=123
def fun():
print x#可以直接使用全局作用域的變量
def fun1():
x=456#定義一個(gè)本地變量,和全局變量不干擾
def fun2():
global x#聲明x為全局變量
x = 456#對x的重新賦值會(huì)影響到全局的x
- 除了在函數(shù)中聲明global語句之外,還有其他的一些方法可以訪問全局變量,如下
x = 123
def fun():
import test
test.x = 456