當前位置: 妍妍網 > 辦公

Python常見問題:全域變量和局部變量

2024-06-17辦公

我在Python教學的過程中發現:幾乎所有的編程學習者在開始用函式不久之後,都踩過 局部變量 的坑。幾乎每個星期,都會有人在答疑群問到關於作用域使用不當而導致的問題。(前兩天我在知識星球裏剛回答了一個)

所以,如果你對 「全域變量」、「局部變量」、「形參」、「實參」、「變量作用域」 這幾個概念還不是理解得非常清楚,可以讀一讀今天這篇文章。

這些內容,在我們的教程裏都有,包含在了:

這裏再幫大家理一下。

首先來看這樣一段程式碼:

deffunc(x):
print('x =', x)
y = 10
x += y
print('x =', x)
return x
a = 5
b = 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 已不存在。

理解了上面幾條之後,我們再修改一下函式:

deffunc(x):
print('x =', x)
x = 10
x += x
print('x =', x)
return x
x = 5
func(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。

但在初學階段,不建議你這麽給變量命名,可能會把自己繞進去。把程式碼寫清楚,多定義幾個變量,多分幾行程式碼,反正也不要錢。

那如果要在函式內部修改外部的變量可不可以呢?

可以,用全域變量。

deffunc():
global x
x = 10
x = 5
func()
print('x =', x)

輸出:

x = 10

在函式中聲明 global x ,程式就會知道這個 x 是一個全域變量 。此時的 x 就是外部的 x,給它賦值的結果自然在函式結束後依然有效。
但這種情況下,你不能再同時將 x 設定為函式的形參。

如果你僅僅需要在函式內部讀取外部的參數值而不用修改它的值,那麽 global 的聲明就不再需要。

deffunc():
y = x
print('y =', y)
x = 5
func()
print('x =', x)

輸出:

y = 5
x = 5

寫入時 global 的必要在於區分全域變量和局部變量,而讀取不存在這樣的問題。

以上就是關於 全域變量、局部變量、形參、實參、變量作用域 的一些小知識點,更多內容可以檢視我們的入門系列教程。

最後留一個思考題:

deffunc(m):
m[
0] = 20
m = [4, 5, 6]
return m
l = [1, 2, 3]
func(l)
print(
'l =', l)

思考一下輸出會是什麽?

然後自己在電腦上或者線上編輯器裏輸入程式碼執行下看看結果,再想想為什麽。

歡迎留言給出你的解釋。

作者:Crossin的編程教室

Crossin的新書【 碼上行動:用ChatGPT學會Python編程 】已經上市了。 本書以ChatGPT為輔助,系統全面地講解了如何掌握Python編程,適合Python零基礎入門的讀者學習。

購買後可加入讀者交流群,Crossin為你開啟陪讀模式,解答你在閱讀本書時的一切疑問。

添加微信 crossin123 ,加入編程教室共同學習 ~

感謝 轉發 點贊 的各位~