python函數的作用域和引用范圍


以下內容參考自runoob網站,以總結python函數知識點,鞏固基礎知識,特此鳴謝!

原文地址:http://www.runoob.com/python3/python3-function.html

變量作用域

Python 中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定於這個變量是在哪里賦值的。

變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱。Python的作用域一共有4種,分別是:

  • L (Local) 局部作用域
  • E (Enclosing) 閉包函數外的函數中
  • G (Global) 全局作用域
  • B (Built-in) 內建作用域

以 L –> E –> G –>B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內建中找。

x = int(2.9) # 內建作用域 g_count = 0 # 全局作用域 def outer(): o_count = 1 # 閉包函數外的函數中 def inner(): i_count = 2 # 局部作用域

Python 中只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這這些語句內定義的變量,外部也可以訪問,如下代碼:

>>> if True: ... msg = 'I am from Runoob' ... >>> msg 'I am from Runoob' >>>

實例中 msg 變量定義在 if 語句塊中,但外部還是可以訪問的。

如果將 msg 定義在函數中,則它就是局部變量,外部不能訪問:

>>> def test(): ... msg_inner = 'I am from Runoob' ... >>> msg_inner Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'msg_inner' is not defined >>>

從報錯的信息上看,說明了 msg_inner 未定義,無法使用,因為它是局部變量,只有在函數內可以使用。


全局變量和局部變量

定義在函數內部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。

局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序范圍內訪問。調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中。如下實例:

#!/usr/bin/python3 total = 0; # 這是一個全局變量 # 可寫函數說明 def sum( arg1, arg2 ): #返回2個參數的和." total = arg1 + arg2; # total在這里是局部變量. print ("函數內是局部變量 : ", total) return total; #調用sum函數 sum( 10, 20 ); print ("函數外是全局變量 : ", total)

以上實例輸出結果:

函數內是局部變量 : 30 函數外是全局變量 : 0

global 和 nonlocal關鍵字

當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了。

以下實例修改全局變量 num:

#!/usr/bin/python3 num = 1 def fun1(): global num # 需要使用 global 關鍵字聲明 print(num) num = 123 print(num) fun1()

以上實例輸出結果:

1 123

如果要修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量則需要 nonlocal 關鍵字了,如下實例:

#!/usr/bin/python3 def outer(): num = 10 def inner(): nonlocal num # nonlocal關鍵字聲明 num = 100 print(num) inner() print(num) outer()

以上實例輸出結果:

100 100

另外有一種特殊情況,假設下面這段代碼被運行:

#!/usr/bin/python3 a = 10 def test(): a = a + 1 print(a) test()

以上程序執行,報錯信息如下:

Traceback (most recent call last): File "test.py", line 7, in <module> test() File "test.py", line 5, in test a = a + 1 UnboundLocalError: local variable 'a' referenced before assignment

錯誤信息為局部作用域引用錯誤,因為 test 函數中的 a 使用的是局部,未定義,無法修改。


免責聲明!

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



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