python中變量的作用域


1. python作用域類型

  1)函數中的局部作用域:local

  2)嵌套函數中父級函數的局部作用域:enclosing

  3)全局作用域:global

  4)系統內置的變量:如 int、str、list 等關鍵字

  變量的查找順序為:局部作用域 > 父級函數作用域 > 當前模塊全局作用域 > 系統內置作用域

 

2. 函數體內部對外部變量的引用

  1)獲取變量

   函數內部可直接獲取外部定義的變量

# 直接獲取變量,此時打印結果為:a = 0
a = 0
 
def func1():    
     print(a)

   如下所示,函數內再定義一個重名的變量,會優先引用局部作用域內的變量,並不會引用到全局變量

# 函數內再聲明一個變量a,並賦值,此時函數內部打印的結果為:a = 1,函數外部打印的結果為:a = 0
a = 0

def func2():
    a = 1
    print(a)
print(a)

 

  2)修改全局變量

   要想在函數內部對全局變量進行修改,需要使用 global 聲明函數體內的這個變量是全局變量

# 用global聲明這是一個全局變量,此時打印結果為:a = 1
a = 0

def func3():
    global a
    a = 1
    print(a)

 

  3)修改父級函數定義的局部變量

    先來看一個錯誤案例

# 這是一個裝飾器,可以簡單先理解為是一個嵌套函數,在父級函數中定義了變量 a,然后在最內層函數中修改 a 的值
def func_error(func):
    a = 5
    def wrapper():
        func()
        a = a + 1
        print(a)
    return wrapper

@func_error
def error_demo():
    pass

error_demo()

   執行后報錯:UnboundLocalError: local variable 'a' referenced before assignment

   

   原因是在wrapper函數內,沒有找到局部變量 a,父級函數中定義的變量作用域只在父級函數的局部作用域

   如果想要使用,則需要在wrapper內使用 nonlocal 來聲明這是一個外層非全局的變量

  

 


免責聲明!

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



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