python 中,乙個變數的作用域總是由在**中被賦值的地方所決定的。
在** global 修飾符之前,我們有必要了解一下python資料型別。
python3 中有六個標準的資料型別:
python3 的六個標準資料型別中:
關於資料型別可變與不可變,有如下定義:
不可變資料型別: 當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體位址也會發生改變,對於這種資料型別,就稱不可變資料型別。
可變資料型別:當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體位址不發生改變,對於這種資料型別,就稱可變資料型別。
總結:不可變資料型別更改後位址發生改變,可變資料型別更改位址不發生改變。
下面** global 修飾符的用法:
1. 不可變資料型別
這裡我們就以string(字串)型別為例進行分析。
2. 可變資料型別
這裡我們以 dictionary(字典)為例進行分析。
在模組層面定義的變數(無需 global 修飾),如果在函式中沒有再定義同名變數,可以在函式中當做全域性變數使用,可以直接進行內容修改:
c = {}
def foo():
# global c
c['a'] = 1
print(c)
foo()
print(c)
輸出結果如下:
{}
測試過程中,不管是否取消 global 得注釋,結果中變數在記憶體中得位址都是一致的。
究其原因,是因為我們在函式內部做的不是重新賦值操作,而是在原有字典物件身上做的修改操作,而非「=」賦值操作,可以不用 golbal 宣告。
c = {}
def foo():
# global c
c =
print(c)
foo()
print(c)
輸出結果如下:
{}
{}
可以看到,沒有使用 global 進行宣告時,字典物件並未在函式中被修改,因為函式中重新宣告的字典物件 c 是乙個全新的,該變數僅為本地作用域;而非全域性作用域中的變數 c。
往深處分析,因為 python 是弱型別語言,賦值語句和其定義變數的語句一樣,所以 c = 這句中,它是」有歧義的「,因為它既可以是表示引用全域性變數 c,也可以是建立乙個新的區域性變數,所以在 python 中,預設它的行為是建立區域性變數,除非顯式宣告 global,global 定義的本地變數會變成其對應全域性變數的乙個別名,即是同乙個變數。
總結:當全域性變數是數字、字串、元組這些不可變資料型別時,在函式重新定義賦值時要用 global 進行宣告;當全域性變數是列表、集合、字典這類可變型別時,在函式內部利用 list 或 dict 的內建函式進行修改時,可以不用 global 宣告」
python中的作用域
python中的作用域分4種情況 x int 2.9 int built in g count 0 global def outer o count 1 enclosing def inner i count 2 local print o count print i count 找不到 inner...
Python 全域性作用域 區域性作用域及遞迴函式
例1 累加def add args 定義可變引數,累加 param args 可變引數 return 累加求和後的值 total 0 for value in args total value return total if name main print add 1,2,3,4,5,10 a 10...
Python 中的作用域 問題
作用域指的是變數在程式中的可應用範圍。作用域按照變數的定義位置可以劃分為4類即legb local 函式內部 區域性作用域。enclosing 巢狀函式的外層函式內部 巢狀作用域 閉包 global 模組全域性 全域性作用域。built in 內建 內建作用域。指的是builtins.py模組 搜尋...