python變量的作用域
1. 作用域
Python的作用域可以分為四種:
L (Local) 局部作用域
E (Enclosing) 閉包函數(shù)外的函數(shù)中
G (Global) 全局作用域
B (Built-in) 內(nèi)建作用域
變量/函數(shù) 的查找順序: L –> E –> G –>B
意思是,在局部找不到的,便去局部外的局部作用域找(例如 閉包),再找不到的就去全局作業(yè)域里找,再找不到就去內(nèi)建作業(yè)域中找。
會(huì)影響 變量/函數(shù) 作用范圍的有
函數(shù):def 或 lambda
類:class
關(guān)鍵字:global noglobal
文件:*py
推導(dǎo)式:[],{},()等,僅限Py3.x中,Py2.x會(huì)出現(xiàn)變量泄露。
1、賦值在前,引用在后
# ------同作用域內(nèi)------
name = "MING"
print(name)
# ------不同作用域內(nèi)------
name = "MING"
def main():
print(name)
2、引用在前,賦值在后(同一作用域內(nèi))
print(name)
name = "MING"
# UnboundLocalError: local variable 'name' referenced before assignment
3、賦值在低層,引用在高層
# L -> E -> G -> B
# 從左到右,由低層到高層
def main():
name = "MING"
print(name)
# NameError: name 'name' is not defined
2. 閉包
閉包這個(gè)概念很重要噢。你一定要掌握。
在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包。其實(shí)裝飾函數(shù),很多都是閉包。
好像并不難理解,為什么初學(xué)者會(huì)覺得閉包難以理解呢?
我解釋一下,你就明白了。
一般情況下,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉,還給內(nèi)存,局部變量都會(huì)消失。但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。
你可以看下面這段代碼,就構(gòu)成了閉包。在內(nèi)函數(shù)里可以引用外函數(shù)的變量。
def deco():
name = "MING"
def wrapper():
print(name)
return wrapper
deco()()
# 輸出:MING
3. 改變作用域
變量的作用域,與其定義(或賦值)的位置有關(guān),但不是絕對(duì)相關(guān)。 因?yàn)槲覀兛梢栽谀撤N程度上去改變向上
的作用范圍。
關(guān)鍵字:global 將 局部變量 變?yōu)槿肿兞?/p>
關(guān)鍵字:nonlocal 可以在閉包函數(shù)中,引用并使用閉包外部函數(shù)的變量(非全局的噢)
global好理解,這里只講下nonlocal。
先來看個(gè)例子
def deco():
age = 10
def wrapper():
age += 1
return wrapper
deco()()
運(yùn)行一下,會(huì)報(bào)錯(cuò)。
# UnboundLocalError: local variable 'age' referenced before assignment
但是這樣就OK
def deco():
age = 10
def wrapper():
nonlocal age
age += 1
return wrapper
deco()()
# 輸出:11
其實(shí),你如果不使用 +=
、-=
等一類的操作,不加nonlocal也沒有關(guān)系。這就展示了閉包的特性。
def deco():
age = 10
def wrapper():
print(age)
return wrapper
deco()()
# 輸出:10
4. 變量集合
在Python中,有兩個(gè)內(nèi)建函數(shù),你可能用不到,但是需要掌握它們。
globals() :以dict的方式存儲(chǔ)所有全局變量
locals():以dict的方式存儲(chǔ)所有局部變量
globals()
def foo():
print("I am a func")
def bar():
foo="I am a string"
foo_dup = globals().get("foo")
foo_dup()
bar()
# 輸出
# I am a func
locals()
other = "test"
def foobar():
name = "MING"
gender = "male"
for key,value in locals().items():
print(key, "=", value)
foobar()
# 輸出
# name = MING
# gender = male
審核編輯:符乾江
-
python
+關(guān)注
關(guān)注
56文章
4823瀏覽量
86111 -
作用域
+關(guān)注
關(guān)注
0文章
6瀏覽量
6203
發(fā)布評(píng)論請(qǐng)先 登錄
Ansible Playbook中的變量使用技巧
混合域示波器的原理和應(yīng)用
快速理解工業(yè)交換機(jī)中的沖突域與廣播域

對(duì)比Python與Java編程語言
圖紙模板中的文本變量

如何在文本字段中使用上標(biāo)、下標(biāo)及變量

Linux環(huán)境變量配置方法
使用Python搭建簡(jiǎn)易本地http服務(wù)器,升級(jí)WIPI模組

評(píng)論