python 全域性變數和區域性變數學習記錄

2021-08-20 18:23:30 字數 1209 閱讀 7165

這是比較專業的解析:

一步一步教你認識python閉包

淺入深談:一道python面試題,讓我明白了殊途同歸,卻開始懷疑自己

函式閉包的概念在初學時容易迷糊,尤其涉及到閉包的作用域和引數問題

以下是標準得半懂不懂瞎琢磨,根據表象猜想原理。

不刪留著,博君一笑

一般假如在函式中定義了同名的區域性變數和全域性變數,在函式中對該變數做的變化不會反映到全域性變數身上。

def test2(st):

st = 'hello'

return st

st = 'hehe'

print(st)

print(test2(st))

print(st)

hehe

hello

hehe

而假如該變數為可變型別如list時,

def test(lis):

return lis

lis = [1,2,3]

print(lis)

print(test(lis))

print(lis)

[1, 2, 3]

[1, 2, 3, 'end']

[1, 2, 3, 'end']

存在同名區域性變數和全域性變數時,感覺腦子要**了。但如果稍微思考一下,並明白python可變型別與不可變型別的區別時,這個現象就能迎刃而解。

廖老師對可變型別和不可變型別的講解

即便全域性變數與區域性變數同名時,這其實也是兩個不同的變數。可以理解為 st_區域性,st_全域性 和 lis_區域性,lis_全域性

而當使用函式傳遞引數時,實際上是做了乙個賦值的行為,即

st_區域性 = st_全域性 = 『hehe』

而當執行

st = 'hello'
時,str 是不可變型別,此時st_區域性 指向 str型別的 『hello』,而st_全域性仍然指向『hehe』

而對於可變型別的list,

這一步驟並沒有建立新的物件和改變lis_區域性的指向。lis_區域性和lis_全域性仍然指向同乙個list物件,且該list被新增了乙個元素'end'。所以最後 lis_全域性 在執行函式後值也被改變了。

關鍵就在於理解變數和物件的關係,可變型別和不可變型別的區別

python全域性變數和區域性變數

總體來說跟c 差不多 有一點不一樣的是,當乙個全域性變數在某一函式中出現了賦值之後,函式中使用的是相同名字的區域性變數,而全域性變數不受影響 如a 100 def f a 100 print a f 這裡,函式內部的變數名如果第一次出現,且出現在 前面,即被視為定義乙個區域性變數。而函式中的a是乙個...

python全域性變數和區域性變數

當你在函式定義內宣告變數的時候,它們與函式外具有相同名稱的其他變數沒有任何關係,即變數名稱對於函式來說是 區域性 的。這稱為變數的 作用域 所有變數的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。使用區域性變數 usr bin python filename func local.py de...

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

定義在函式內部的變數擁有乙個區域性作用域,定義在函式外的擁有全域性作用域。區域性變數只能在其被宣告的函式內部訪問,而全域性變數可以在整個程式範圍內訪問。呼叫函式時,所有在函式內宣告的變數名稱都將被加入到作用域中。如下例項 total 0 這是乙個全域性變數 可寫函式說明 def sum arg1,a...