Python變數的作用域

2021-09-13 22:16:24 字數 3403 閱讀 8311

python程式有各種各樣的命名空間,它指的是在該程式段內乙個特定的名稱是獨一無二的,它和其它同名的命名空間是無關的。

在python中每乙個函式都有自己的命名空間,如果在函式體外部,也就是主程式範圍內定義乙個變數a,然後在函式體內也定義乙個變數a,那麼兩者指帶的是不同的變數。但是要知道的是場景總是多變的,假設我需要在函式體內也訪問並修改乙個定義在主程式範圍內的變數是否可以呢?

先來看乙個例子,我們在函式體外定義了乙個變數name,我們在函式體內使用到了這個變數,最終在執行函式體時也可以正確獲取到定義在函式體外的變數值。

name =

'james'

defprint_username()

:print

('hello:'

, name)

print_username(

)# 輸出如下:

# hello: james

那麼,假設我需要在函式體內也訪問並修改乙個定義在主程式範圍內的變數是否可以呢?

name =

'james'

defprint_username()

:if name ==

'james'

: name =

'mary'

print

('hello:'

, name)

print_username(

)# 輸出如下:

# unboundlocalerror: local variable 'name' referenced before assignment

沒錯,你看到了它會報錯。但是如果我在函式體內重新定義乙個和外部區域一樣的變數名,就不會報錯了。

name =

'james'

defprint_username()

: name =

'james'

if name ==

'james'

: name =

'mary'

print

('hello:'

, name)

print_username(

)# 輸出如下:

# hello: mary

name =

'james'

defprint_username()

: name =

'james'

if name ==

'james'

: name =

'mary'

print

('hello:'

, name)

print_username(

)print

(name)

# 輸出如下:

# hello: mary

# james

我們可以用python的內建函式id()來檢視物件的記憶體空間一查究竟。

name =

'james'

defprint_username()

: name =

'james'

if name ==

'james'

: name =

'mary'

print

('hello:'

, name)

print

("inside:",id

(name)

)

print_username(

)print

("outside:"

, name)

print

("outside:",id

(name)

)# 輸出如下:

# hello: mary

# inside: 4691515968

# outside: james

# outside: 4898181448

從物件的唯一id值我們就可以證明這兩個變數其實沒有任何關係。

那麼問題來了,如果我就是想在函式體內修改函式體外的全域性變數名的數值該怎麼做呢?在python中,只需要在你要呼叫的函式體內的變數名前顯式地新增關鍵字global就可以了。再次執行一遍**,我們可以看到兩個變數name的各自物件id值都相同了,而且輸出的值也被修改為mary了,說明函式體內的變數成功修改了全域性變數name,它們已經是同乙個物件了。

name =

'james'

defprint_username()

:global name

if name ==

'james'

: name =

'mary'

print

('hello:'

, name)

print

("inside:",id

(name)

)

print_username(

)print

("outside:"

, name)

print

("outside:",id

(name)

)# 輸出如下:

# hello: mary

# inside: 4691515968

# outside: mary

# outside: 4691515968

要記住,如果函式中不宣告關鍵字global,那麼python會使用區域性命名空間,同時變數也是區域性的。

另外,python還提供了兩個內建函式可以幫助我們獲取命名空間內的資訊。

我們可以看到locals()函式輸出了區域性命名空間裡的內容,只含有區域性變數name,因為我們沒有使用gloabl關鍵字將它全域性化。而全域性命名空間顯示的內容就多了很多。

name =

'james'

defprint_username()

: name =

'james'

if name ==

'james'

: name =

'mary'

print

('locals:'

,locals()

)

print_username(

)print

('globals:'

,globals()

)# 輸出如下:

# locals:

# globals:

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 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會去全...