天天看點

python變量作用域python變量作用域

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值被修改
           

繼續閱讀