python變量作用域
2017年07月30日 10:11:49 煎餅灬果子 閱讀數:5400 标簽: python 更多
個人分類: python
版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/bylhjcsmmd/article/details/76372110
python的作用域并不是哪裡都能通路的,類似于Java,分全局和局部,python變量的作用域大概分為以下四類:
L(local) 局部作用域
E(Enclosing) 閉包函數外的函數中
G(Global) 全局作用域
B(Built-in) 内建作用域
遵循LEGB原則:以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去内建中找。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 閉包函數外的函數中
def inner():
i_count = 2 # 局部作用域
- 1
- 2
- 3
- 4
- 5
- 6
- 7
在python中,子產品(module),類(class)、函數(def、lambda)會産生新的作用域,其他代碼塊是不會産生作用域的,也就是說,類似條件判斷(if…..else)、循環語句(for x in data)、異常捕捉(try…catch)等的變量是可以全局使用的
dataList = [1, 2, 3, 4]
for data in dataList:
a = 1 #for循環中的變量a
b = data + a
print(a) #在函數外也可視為全局變量使用
- 1
- 2
- 3
- 4
- 5
- 6
全局變量是指在函數外的變量,可以在程式全局使用,局部變量是指定義在函數内的變量,隻能在函數内被聲明使用
若内部作用域的想要修改外部作用域的變量,就要使用global關鍵字:參考一下代碼
1、未使用global關鍵字
a = 1
def demo():
# IDE提示a = 123:This inspection detects shadowing names defined in outer scopes
# 大概意思是給變量取的這個名字,可能會沖突,它是函數外部的變量
a = 123
print(a)
demo()
print(a)
運作結果是
123
1
全局變量a的值還是1,沒有被改變
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
2、使用global關鍵字
a = 1
def demo():
global a
a = 123
print(a)
demo()
print(a)
運作結果是
123
123
全局變量a的值被修改
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
nonlocal 關鍵字的使用方法和global關鍵字類似,修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量
def outer():
num = 10
def inner():
nonlocal num # nonlocal關鍵字聲明
num = 100
print(num)
inner()
print(num)
outer()
運作結果為
100
100
閉包函數外的變量num值被修改