你有沒有想過,函數(shù)的實(shí)參,其實(shí)本質(zhì)上也是全局變量?聽起來有點(diǎn)反常識(shí)對吧?別急,今天我們就用一個(gè)真實(shí)案例,帶你揭開這個(gè)“隱藏真相”。
先來個(gè)小測試:假設(shè)你寫了一個(gè)函數(shù):
def greet(name): print(f"你好,{name}!")當(dāng)你調(diào)用 `greet("小明")` 時(shí),傳進(jìn)去的 `"小明"` 是不是局部變量?很多人會(huì)下意識(shí)說:“是啊,它只在函數(shù)里能用!”但其實(shí)——它也屬于全局作用域的一部分!
為什么這么說?因?yàn)?Python 中,函數(shù)參數(shù)的本質(zhì)是“引用傳遞”。也就是說,`name` 這個(gè)變量名,在函數(shù)內(nèi)部指向的是你傳入的那個(gè)字符串對象。而這個(gè)對象本身,是從全局作用域中“拿”過來的。
舉個(gè)更真實(shí)的例子:我在小紅書做內(nèi)容運(yùn)營時(shí),曾遇到過一個(gè)坑——我寫了這樣一個(gè)函數(shù):
user_list = ["張三", "李四"]def add_user(user): user_list.append(user) return len(user_list)add_user("王五")print(user_list) 輸出:['張三', '李四', '王五']你以為 `user` 是局部變量?錯(cuò)!它只是指向了全局變量 `user_list` 的一個(gè)引用。如果你把 `user` 改成 `user_list.append(user)`,那它其實(shí)是在操作全局變量!這就是很多初學(xué)者踩坑的地方——明明想“隔離數(shù)據(jù)”,結(jié)果卻悄悄改了全局狀態(tài)。
所以,結(jié)論來了:函數(shù)的實(shí)參不是“局部變量”,而是“全局變量的引用”或“全局對象的副本”。它們之所以看起來像局部變量,是因?yàn)?Python 的作用域規(guī)則(LEGB)讓它們在函數(shù)內(nèi)“可訪問”,但本質(zhì)還是來自外部世界。
這不就是我們常說的“變量的生命周期”嗎?實(shí)參在函數(shù)調(diào)用期間存在,函數(shù)結(jié)束就釋放引用,但它從哪兒來?當(dāng)然是從全局來的!就像你發(fā)朋友圈時(shí),照片是從手機(jī)相冊里選的,雖然發(fā)完就“看不見了”,但源頭永遠(yuǎn)在你的全局存儲(chǔ)里。
下次寫函數(shù)時(shí),不妨多問一句:“這個(gè)實(shí)參,真的只是局部嗎?”你會(huì)發(fā)現(xiàn),理解了這一點(diǎn),你寫的代碼會(huì)更干凈、更安全,尤其在團(tuán)隊(duì)協(xié)作中,避免“變量污染”簡直不要太爽!
??小貼士:如果真想隔離,記得用 `copy()` 或者 `deepcopy()`,別讓實(shí)參變成全局的“隱形刺客”!

