python函数变量的作用域_学不会的Python函数——变量作用域
1. LEGB函數
Python中,程序的變量并不是在哪個位置都可以訪問的,訪問權限決定于這個變量是在哪里賦值的。我們先來看一段代碼。
上述代碼有兩個變量a,當在test函數中輸出變量a的值是,為什么輸出的是20,而不是10呢?其實是因為變量作用域不同導致的。
變量的作用于決定了在那一部分程序可以訪問哪個特定的變量名稱。Python的作用于一共有以下四種。L(Local):函數內的區域,包括局部變量和形參。
E(Enclosing):外面嵌套函數區域,常見的是閉包函數外的函數。
G(Global):全局作用域。
B(Bulit-in):內建作用域。
Python中變量采用L->E->G->B的規則查找,即Python檢索變量的時候,顯示在局部中查找,如果找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,在者去內建中找。
2. 全局變量和局部變量
變量的作用域始終是Python學習中一個必須理解掌握的環節,下面我們從局部變量和全局變量開始全面解析Python中變量的作用域。
所謂局部變量,指的是在定義在函數內的變量。即定義在def函數內的變量名,只能在def函數內使用,它與函數外具有相同的名稱的其他變量沒有任何關系。不同的函數可以定義相同名字的局部變量,并且各個函數內的變量不會產生影響。
def test1():
num = 100
print("test1中的num值為%d" %num)
def test2():
num = 200
print("test2中的num值為%d" %num)
test1()
test2()
運行結果:
局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序范圍內訪問。全局變量是定義在函數外的變量,它擁有全局作用域。
result = 100#定義一個全局變量,整個代碼內調用
def sum(a,b):
result = a + b#定義一個局部變量,在函數內部調用
print("函數內的result的值為:",result)
#函數的返回值,result在這里是局部變量
return result
#調用函數后,打印返回值顯示局部變量
sum(100,200)
#直接調用全局變量,跟函數沒關系
print("函數外的result是全局變量,等于",result)
運行結果:
3. global和nonlocal關鍵字
當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了。
3.1 global關鍵字
global關鍵字用來在函數或其他局部作用域中使用全局變量。但是如果不修改全局變量也可以不使用global關鍵字。
上述程序報錯,提示”在賦值前引用了局部變量a“。但是,前面我們明明是可以在函數中訪問全局變量的啊。而這里為什么會出錯呢?
這就是Python與其他語言不同之處了。在Python中,如果在函數內部對全局變量a進行修改,Python會把變量a當作是局部變量,而在進行”a += 100“之前,我們是沒有聲明局部變量a的,因此,程序會出現上述錯誤提示。
為了使全局變量生效,我們可以在函數內使用global關鍵字進行聲明。
這下,程序不但沒有報錯,而且成功對全局變量進行了修改。
3.2 nonlocal關鍵字
nonlocal是在Python3.0中新增的關鍵字。使用nonlocal關鍵字可以在一個嵌套的函數中修改嵌套作用域中的變量。
上面的程序中,在嵌套的func_in函數中,對變量count賦值,同時會創建一個新的變量,而非使用count = 1語句中的count,如果要修改嵌套作用域中的count,就要使用nonlocal關鍵字了。
上述代碼中,在func_in()函數中使用了nonlocal關鍵字,就會告訴Python在func函數中使用嵌套作用域中的變量count,因此對變量count進行修改時,會直接影響到嵌套作用域中的count變量,程序最后也就輸出12了。
注意:使用global關鍵字進行修飾的變量之前可以不存在,而使用nonlocal關鍵字進行修飾的變量在嵌套作用域中必須已經存在。
Python其實沒有那么難。
總結
以上是生活随笔為你收集整理的python函数变量的作用域_学不会的Python函数——变量作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql基础知识整理_MYSQL基础知
- 下一篇: ubuntu 编译mysql_Ubunt