王菊這波熱點來得莫名其妙啊,讓我們這些「菊外人」一臉懵逼。
前陣子還自我吐槽了下文章的選題,熱點沒營養,乾貨沒人看。這下好了,找到了熱點與乾貨的完美結合?
是誰的小眼睛,還沒看crossin老師?
明確地說,我今天就是來蹭熱點話題流量的。(雖然我覺得事件本身也挺有意思的,已成路人粉)
如果你對此感到不適,或對於變數作用域的相關概念已了然於心,那後面的內容就不必看了,謝謝!
但根據我的經驗,幾乎所有的程式設計學習者在開始用函式不久之後,都踩過區域性變數的坑。幾乎每個星期,都會有人在答疑群、知識星球、論壇、微博上問到關於作用域使用不當而導致的問題。(昨天我在微博上剛回答了乙個)
所以,如果通過這個略有點惡趣味的熱點事件能讓你記住「全域性變數」、「區域性變數」、「形參」、「實參」、「變數作用域」這幾個概念,我覺得也挺好啊。
這些內容,在我們的教程裡都有,包含在了:
【python 第67課】函式的引數傳遞 | 【python 第71課】變數的作用域
這裡再幫大家理一下。
首先來看這樣一段**:
def
func(x
):print
('x =',x
)y=10
x+=yprint
('x =',x
)returnxa
=5b=
func(a
)print
('a =',a
)print
('b =',b
)複製**
輸出:
x = 5
x = 15
a = 5
b = 15
複製**
這裡,函式 func 的形參是 x,它只在函式內部有效,也就是作用域僅在函式中,如果在外部呼叫它,就會報錯。
變數a 作為實參傳遞給函式 func,所以函式裡 x 的值就是 a 的值,但x 不是 a,只是現在它倆一樣。
變數 y 是函式中定義的區域性變數,它的作用域同樣也僅在函式中。
對 x 進行賦值之後,x 的值發生了變化,但不會影響實參 a 的值。
函式的返回值是 x的值,並賦值給了外部的變數 b,所以 b 的值就是 x 的值,但 b 不是 x,此時 x 已不存在。
理解了上面幾條之後,我們再修改一下函式:
def
func(x
):print
('x =',x
)x=10
x+=xprint
('x =',x
)returnxx
=5func(x
)print
('x =',x
)複製**
輸出:
x = 5
x = 20
x = 5
複製**
解讀一下:
函式 func 的形參是 x。
外部變數 x作為實參傳遞給函式 func,所以函式裡 x 的值就是外部 x 的值,但這兩個 x 是兩個不同的變數,只是現在值一樣。
變數 x 在函式中被重新賦值 10,但不會影響外部變數 x 的值。
對 x 自身做了累加,此時 x 變成 20。
函式的返回值是 x的值,但沒有賦值給任何變數,所以此返回值沒任何作用,函式結束。
外部的變數 x 仍然是一開始的值 5。
但在初學階段,不建議你這麼給變數命名,可能會把自己繞進去。把**寫清楚,多定義幾個變數,多分幾行**,反正也不要錢。(除非你是做區塊鏈程式開發)
那如果要在函式內部修改外部的變數可不可以呢?
可以,用全域性變數。
def
func
():globalxx
=10x=
5func
()print
('x =',x
)複製**
輸出:
x = 10
複製**
在函式中宣告global x,程式就會知道這個x 是乙個全域性變數。此時的 x 就是外部的 x,給它賦值的結果自然在函式結束後依然有效。
但這種情況下,你不能再同時將 x 設定為函式的形參。
如果你僅僅需要在函式內部讀取外部的引數值而不用修改它的值,那麼 global 的宣告就不再需要。
def
func
():y=x
print
('y =',y
)x=5
func
()print
('x =',x
)複製**
輸出:
y = 5
x = 5
複製**
寫入時 global 的必要在於區分全域性變數和區域性變數,而讀取不存在這樣的問題。
最後留乙個思考題:
def
func(m
):m[0
]=20m
=[4,
5,6]
returnml
=[1,
2,3]
func(l
)print
('l =',l
)複製**
思考一下輸出會是什麼?
如何自學python | 新手引導 | 精選
python
問答 | python單詞表 | 區塊鏈 | 人工智慧 | 雙11 | 嘻哈 | 爬蟲 | 排序演算法
4 11 區域性變數和全域性變數
在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的。同樣,在復合語句中定義的變數只在本復合語句範圍內有效。這稱為 區域性變數 local variable 如 對區域性變數的一些說明 1 主函式main中定義的變數 m,n...
變數提公升全解析
1.變數的提公升 將變數的宣告提公升到執行環境的最頂端 console.log a 輸出結果 undefined var a 10 相當於 var a console.log a 輸出結果 undefined var a 10 1.0注 函式的引數,相當遠在函式體內宣告了區域性變數 var a 0 ...
python 09 區域性變數和全域性變數
區域性變數是在函式內部定義的變數,只能在函式內部使用 全域性變數是在函式外部定義的變數 沒有定義在某 個函式內 所有函式內部都可以使用這個變數 提示 在其他的開發語言中,大多不推薦使用全域性變數 可變範圍太大,導致程式不好維護 區域性變數是在函式內部定義的變數,只能在函式內部使用 函式執行結束後,函...