python 全域性變數與區域性變數

2021-08-27 03:28:19 字數 2423 閱讀 1254

目錄

一、變數作用域

二、全域性變數&區域性變數

2.1 global 和nonlocal關鍵字

python中,變數不是在**都可以訪問的,訪問許可權決定於變數是在**被賦值的。變數作用域決定了哪一部分程式可以訪問哪些特定的變數。python的作用域一共分為四種:

程式查詢變數的規則為:l-->e-->g-->b ,通過位置怎麼去判斷變數屬於那種變數,請看下**:

x=range(0,10) #內建作用域

spam=10 #全域性作用域

def outer():

eggs=10 # 閉包函式外的函式中

def inner():

那什麼時候程式會引入新的作用域呢?python中只有類、模組、函式才會引入新的作用域。其他的**塊(如 if/elif/else , for/while)等是不會引入新的作用域的,語句內定義的變數,外部也可以訪問,如下**:

if true:

msg='hello world'

print(msg) #hello world

這段**,變數msg在if語句塊中,但是外部也可以訪問。

全域性變數:變數定義在函式外部。全域性作用域,是程式開始的時候建立的,程式終止,全域性作用域就會被銷毀,它的所有變數就會被丟棄。

區域性變數:變數定義在函式內部。函式被呼叫,或者被另乙個函式呼叫時,區域性作用域就建立了,該函式返回時,區域性作用域就會被銷毀。

兩者之間的關係:全域性作用域中程式不能使用區域性作用域中的變數,但是區域性作用域中可以使用全域性變數。同時區域性作用域不可以使用其他區域性作用域中的變數。

請看例項:

def spam():

eggs=99

bacon()

print(eggs)

def bacon():

ham=101

eggs=0

spam() #99

例項分析:為什麼輸出的是99而不是0呢?

在程式開始執行時, spam()函式被呼叫, 建立了乙個區域性作用域。區域性變數eggs被賦值為 99。然後 bacon()函式被呼叫, 建立了第二個區域性作用域。多個區域性作用域能同時存在。在這個新的區域性作用域中, 區域性變數 ham 被賦值為 101。區域性變數 eggs(與 spam()的區域性作用域中的那個變數不同) 也被建立, 並賦值為 0。當 bacon()返回時, 這次呼叫的區域性作用域被銷毀。程式執行在 spam()函式中繼續, 列印出 eggs 的值。因為 spam()呼叫的區域性作用域仍然存在, eggs 變數被賦值為 99。

要點在於,乙個函式中的區域性變數完全與其他函式中的區域性變數分隔開來。

當區域性作用域想要修改全域性作用域中的變數時,就需要用到global和nonlocal關鍵字了。

如果要修改全域性變數,要用到global管家字:

#全域性變數可以在區域性變數中讀取

def spam():

global eggs

print(eggs)

eggs=10

print(eggs)

eggs=42

spam() # 42 10

如果要修改巢狀作用域(enclosing作用域,就是外層的非全域性作用域)則需要nonlocal關鍵字,如下:

def outer():

num=10

def inner():

nonlocal num #nonlocal關鍵字宣告

num=99

print(num)

inner()

print(num)

outer() # 99 99

還有一種情況,通過引數傳遞來使用全域性變數,如下例項:

a=10

def test():

a=a+1

print(a)

test()

執行後會報錯:

traceback (most recent call last):

file "e:/ideaprojects/demi/20180904-1.py", line 151, in test()

file "e:/ideaprojects/demi/20180904-1.py", line 149, in test

a=a+1

unboundlocalerror: local variable 'a' referenced before assignment

報錯為區域性作用域引用錯誤。但是可以將全域性變數a作為引數傳入到test函式中,如下:

a=10

def test(a):

a=a+1

print(a)

test(a) #11

輸出就是11了。

Python 區域性變數與全域性變數

問題由來 考慮到想在執行結束後的使用者空間裡面檢視一下資料,我把data1作為全域性變數來進行處理。data1 function a1 data1 readdata function a2 data1.dealdata if name main a1 a2 此時,a2 函式沒有任何輸出,即data1...

python區域性變數與全域性變數

區域性變數 區域性變數是在函式內部進行使用,無法全域性共享 全域性變數 全域性變數在函式外部進行共享使用,可以接收函式的呼叫 區域性變數 def demo1 num 1print num defdemo2 print num print會報錯,原因顯示為沒有定義num這個變數,所以證明在demo1中...

python全域性變數與區域性變數

全域性變數 指在函式之外定義的變數,一般沒有縮排,在程式執行的全過程有效 區域性變數 指在函式內部使用的變數,僅在函式內部有效,當函式退出時變數將不存在 例1 n 1 全域性變數 def func a,b c a b c是區域性變數,a和b作為函式引數也是區域性變數 這個例子說明,當函式執行完退出後...