Python中的全域性變數和區域性變數

象牙塔小明發表於2018-10-05

區域性變數與全域性變數名一樣時

當區域性變數和全域性變數名字一樣時,依然是不同的變數,但是值一樣時,地址依然一樣,類似於兩個不同的指標指向同一個地址。值不一樣時,地址不一樣,修改區域性變數,全域性變數的值依然不變,例如:

num = 100

def test():
    num = 99
    print("區域性變數num的值:%d,地址為:%d" % (num, id(num)))

test()
print("全域性變數num的值:%d,地址為:%d" % (num, id(num)))

輸出:
區域性變數num的值:99,地址為:492861520
全域性變數num的值:100,地址為:492861552

Python中,當全域性變數和區域性變數的名字一樣時,函式內會優先使用區域性變數的值,函式內也沒辦法通過賦值直接修改全域性變數的值。

如果要在區域性修改全域性變數的值時

修改成如下程式碼:

num = 100

def test():
    global num  #告訴直譯器num是全域性變數
    num = 99
    print("區域性變數num的值:%d,地址為:%d" % (num, id(num)))

test()
print("全域性變數num的值:%d,地址為:%d" % (num, id(num)))

輸出:
區域性變數num的值:99,地址為:492861520
全域性變數num的值:99,地址為:492861520

針對函式引數使用賦值語句,會在函式內部修改區域性變數的引用,不會影響到外部變數的引用

def demo(num, num_list):
    print("函式內部")

    # 賦值語句
    num = 200
    num_list = [1, 2, 3]

    print(num)
    print(num_list)


gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print("函式外部")
print(gl_num)
print(gl_list)

輸出:
函式內部
200
[1, 2, 3]
函式外部
99
[4, 5, 6]

如果傳遞引數是可變型別,在函式內部,使用方法修改了資料的內容,同樣會影響到外部的資料

def demo(num_list):
    print("函式內部")

    # 使用方法修改內部的程式碼
    num_list.append(9)
    print(num_list)


gl_list = [1, 2, 3]
demo(gl_list)
print("函式外部")
print(gl_list)

輸出:
函式內部
[1, 2, 3, 9]
函式外部
[1, 2, 3, 9]

相關文章