python小白問(wèn)題 關(guān)于局部變量和全局變量
問(wèn)題描述
第一段代碼:
# -*- coding:gb2312 -*-nums = [11,22,33,44,55]def nums_chang(): nums = [11,22,33,44,55,999] print(nums)nums_chang() # 打印出來(lái)是[11,22,33,44,55,999]print(nums) # 打印出來(lái)是[11,22,33,44,55]
運(yùn)行結(jié)果:

第二段代碼:
# -*- coding:gb2312 -*-nums = [11,22,33,44,55]def nums_chang(): nums.append(999) # 打印出來(lái)是[11,22,33,44,55,999] print(nums) # 打印出來(lái)是[11,22,33,44,55,999]nums_chang()print(nums)
運(yùn)行結(jié)果:

我的問(wèn)題是:為什么第一段代碼打印出來(lái)兩個(gè)結(jié)果是不一樣的,而第二段代碼打印出來(lái)的結(jié)果是一樣的? 特別是第二段代碼,為什么函數(shù)里面的append命令,可以修改外面的全局變量。而第一段代碼當(dāng)中,重新定義一次列表,卻無(wú)法修改外面的全局變量? 這里的原因是什么?
問(wèn)題解答
回答1:看了下采納答案,我覺(jué)得還是沒(méi)說(shuō)到點(diǎn)子上面。首先nums變量被定義為了全局變量,也就說(shuō)在這個(gè)'.py'文件里面,所有類、函數(shù)都可以使用它。但是所有變量也是一個(gè)對(duì)象,而對(duì)象分為可變和不可變。而列表是可變對(duì)象,也就是說(shuō)可以變更。那么什么是可變對(duì)象?就是那些可以對(duì)對(duì)象操作,而不影響在內(nèi)存中的生滅。入x='234',如果你再賦值,x='111'。其實(shí)兩個(gè)x已經(jīng)是兩個(gè)對(duì)象了,只是覆蓋了而已,即x = x + '123',x也是一個(gè)新對(duì)象。
如果是列表,x = [1,2,3],現(xiàn)在對(duì)它操作,x.remove(1),那么x對(duì)象還是x對(duì)象,只是對(duì)象的值有改變
第一段代碼:就是重新賦值,在不同的作用域,nums賦值了一遍,這樣全局變量nums和nums_chang函數(shù)里面的nums變量就不再是一個(gè)對(duì)象,他們是不同的,因此你打印的時(shí)候出現(xiàn)了不同的值,此時(shí)nums_chang函數(shù)里面的nums變量已經(jīng)是一個(gè)局部變量,只給這個(gè)函數(shù)使用
第二段代碼:nums是個(gè)列表,是可變對(duì)象,因此對(duì)列表的操作,不影響這個(gè)對(duì)象,因此這個(gè)對(duì)象還是全局中的那個(gè),函數(shù)和外面都是用的全局變量,因此你修改了之后,全局變量的值也跟著修改了
回答2:第一: 關(guān)于作用域的問(wèn)題, 可以先參考下我的一篇文章: Python: 作用域(scope) 和 LEGB, 可以先對(duì)變量的查找有個(gè)基本的認(rèn)識(shí),然后我們能夠看到, 因?yàn)橛匈x值語(yǔ)句, 所以nums只會(huì)只會(huì)從局部作用域查找,并不會(huì)和全局作用域有關(guān)系
第二: 在第一的基礎(chǔ)上, 我們可以看到nums.append(999)中的nums是從全局作用域找到的, 又因?yàn)橛玫氖莂ppend方法, 這方法是直接用于源列表本身, 所以你看到全局的nums也被更新了
回答3:函數(shù)在自己的作用域找不到變量,就回去上一級(jí)作用域找,你的第二個(gè)就是這樣來(lái)的。第一個(gè)的話,和明顯你賦值了呀
相關(guān)文章:
1. javascript - immutable配合react提升性能?2. javascript - sublime快鍵鍵問(wèn)題3. Apache 已經(jīng)把網(wǎng)站根目錄的改為allow from all了,但是服務(wù)器還是不能訪問(wèn)?4. javascript - 移動(dòng)端上不能實(shí)現(xiàn)拖拽布局嗎?5. css - 寫(xiě)頁(yè)面遇到個(gè)布局問(wèn)題,求大佬們幫解答,在線等,急!~6. vue.js - Vue 如何像Angular.js watch 一樣監(jiān)聽(tīng)數(shù)據(jù)變化7. 配置Apache時(shí),添加對(duì)PHP的支持時(shí)語(yǔ)法錯(cuò)誤8. 實(shí)現(xiàn)bing搜索工具urlAPI提交9. phpstudy8.1支持win11系統(tǒng)嗎?10. javascript - nodejs關(guān)于進(jìn)程間發(fā)送句柄的一點(diǎn)疑問(wèn)

網(wǎng)公網(wǎng)安備