Python變數作用域

2021-08-15 00:02:10 字數 2832 閱讀 8310

python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在**賦值的。

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

l (local) 區域性作用域

e (enclosing) 閉包函式外的函式中

g (global) 全域性作用域

b (built-in) 內建作用域

以 l –> e –> g –>b 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會去全域性找,再者去內建中找。

x = int(2.9)  # 內建作用域

g_count = 0

# 全域性作用域

defouter

(): o_count = 1

# 閉包函式外的函式中

definner

(): i_count = 2

# 區域性作用域

return inner # 不帶括號

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

>>> if true:

... msg = 'i am from china'

...

>>> msg

'i am from china'

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

如果將 msg 定義在函式中,則它就是區域性變數,外部不能訪問:

>>> def test():

... msg_inner = 'i am from china'

...

>>> msg_inner

traceback (most recent call last):

file "", line 1, in

nameerror: name 'msg_inner' is not defined

>>>

從報錯的資訊上看,說明了 msg_inner 未定義,無法使用,因為它是區域性變數,只有在函式內可以使用。

全域性變數和區域性變數

定義在函式內部的變數擁有乙個區域性作用域,定義在函式外的擁有全域性作用域。

區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。呼叫函式時,所有在函式內宣告的變數名稱都將被加入到作用域中。如下例項:

#!/usr/bin/python3

total = 0; # 這是乙個全域性變數

# 可寫函式說明

defsum

( 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

deffun1

():global num # 需要使用 global 關鍵字宣告

print(num)

num = 123

print(num)

fun1()

#以上例項輸出結果:

1123

# 如果要修改巢狀作用域(enclosing 作用域,外層非全域性作用域)中的變數則需要 nonlocal 關鍵字了,如下例項:

#!/usr/bin/python3

defouter

(): num = 10

definner

():nonlocal num # nonlocal關鍵字宣告

num = 100

print(num)

inner()

print(num)

outer()

以上例項輸出結果:

100100

另外有一種特殊情況,假設下面這段**被執行:

#!/usr/bin/python3

a = 10

deftest

(): a = a + 1

print(a)

test()

# 以上程式執行,報錯資訊如下:

traceback (most recent call last):

file "test.py", line 7, in

test()

file "test.py", line 5, in test

a = a + 1

unboundlocalerror: local variable 'a' referenced before assignment

錯誤資訊為區域性作用域引用錯誤,因為 test 函式中的 a 使用的是區域性,未定義,無法修改。

參考:

python變數作用域

變數作用域 scope 在python中是乙個容易掉坑的地方。什麼是作用域 作用域簡單說就是乙個變數的命名空間。中變數被賦值的位置,就決定了哪些範圍的物件可以訪問這個變數,這個範圍就是命名空間。python賦值時生成了變數名,當然作用域也包括在內。python的作用域一共有4中,分別是 l loca...

Python 變數作用域

g global defchange global g g g change print g change print g 結果 global globalchange def function g function deflocalvar g local defglobalvar global g...

變數作用域 python

python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l e g b 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會去全...