Python中有一個(gè)問題:
循環(huán)變量泄漏
構(gòu)造一個(gè)實(shí)際的環(huán)境,當(dāng)連上WiFi的時(shí)候,手機(jī)才能更新app,下面的是網(wǎng)絡(luò)環(huán)境的判斷
![圖片](http://file1.elecfans.com/web2/M00/81/C1/wKgZomQBm5GAf-gkAAAnNprd0Hc755.jpg)
可以看到,這里的 x 是一個(gè)在for循環(huán)的局部變量,按照正常的理解,
在for循環(huán)外面調(diào)用 x 應(yīng)該是報(bào)錯(cuò)的,
但是在Python中,
for循環(huán)里面聲明的變量,在for循環(huán)結(jié)束后,會(huì)保留 x 的值。
![圖片](http://file1.elecfans.com/web2/M00/81/C0/wKgaomQBm5GANxTUAAAQIg8c9qc360.jpg)
上面的輸出的結(jié)果,第一個(gè) x 的值當(dāng)然是 WiFi,
第二個(gè)值就是遍歷完列表之后,列表最后一個(gè)值4G。
那如果我們直接聲明一個(gè)全局變量呢,最后輸出的會(huì)是最開始的值嗎?
下面的代碼只是加了第3行,初始化了一下全局變量 x:
![圖片](http://file1.elecfans.com/web2/M00/81/C0/wKgZomQBm5GAUC-kAAApgEJbKtU080.jpg)
輸出的結(jié)果:
![圖片](http://file1.elecfans.com/web2/M00/81/C1/wKgZomQBm5GAD-syAAAP9B5j7-s617.jpg)
還是和第一種情況一樣,
充分說明了Python中,for循環(huán)中聲明的臨時(shí)變量的值會(huì)保留下來,
壞處很明顯,
一個(gè)局部變量沒有被銷毀,反而保留了下來,習(xí)慣其他語言的程序員寫起來很別扭,
一個(gè)不注意,可能還會(huì)有bug,一個(gè)后面怎么都不會(huì)想到的會(huì)出問題的地方,
避免起來很簡單,
注意好命名就行,不要隨便命名,全局變量和局部變量同名本來也不是個(gè)好習(xí)慣。
下面是Python中列表推導(dǎo)式,在Python3中被優(yōu)化過,
其實(shí)看到下圖的紅色波浪線,就大概知道,x 在這種情況下,只是一個(gè)局部變量了。
![圖片](http://file1.elecfans.com/web2/M00/81/C1/wKgaomQBm5KAf7jAAAAnDx-MCh4940.jpg)
輸出結(jié)果:
![圖片](http://file1.elecfans.com/web2/M00/81/C0/wKgZomQBm5GAWJgsAAA7EcBfyqg988.jpg)
顯而易見,報(bào)錯(cuò)是 x 沒有定義,x 已經(jīng)被當(dāng)作是局部變量了
聲明一個(gè)全局變量 x,值為WiFi,
![圖片](http://file1.elecfans.com/web2/M00/81/C0/wKgaomQBm5GAYBmHAAAqWhj3Ldw120.jpg)
輸出結(jié)果:
![圖片](http://file1.elecfans.com/web2/M00/81/C0/wKgaomQBm5GAQ70hAAAQiggdiyc976.jpg)
輸出都是WiFi,第4行的 x 已經(jīng)沒有影響了。
所以平時(shí)要注意Python中的一些坑,
Python易用的同時(shí),也有難用的地方。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
相關(guān)推薦
我編了一個(gè)程序,事件循環(huán)結(jié)構(gòu),沒有像labview風(fēng)格那樣用很多移位寄存器,代之以大量局部變量。請問各位大師,用大量局部變量的做法會(huì)不會(huì)影響程序運(yùn)行效率?和移位寄存器相比,兩種方法各有什么優(yōu)缺點(diǎn)?請從效率,可讀性,內(nèi)存空間復(fù)雜度
發(fā)表于 04-05 15:34
`` 對于初學(xué)Labview的人來說,局部變量這個(gè)東西有時(shí)候感覺很方便很好用,但是在這里,我的建議是如果你想寫出一段無論是維護(hù)性還是可讀性上都較好的代碼,那么就請慎用局部變量!為什么不建議大家
發(fā)表于 02-25 11:11
2,3是1的局部變量,這時(shí)一個(gè)范例,我不明白為什么1和2要與非又給3,這樣的話當(dāng)1,2,3為真時(shí),1和2與非后為假,3就為假了,而3又是1的局部變量,1,2就變?yōu)榧倭耍?b class='flag-5'>循環(huán)不就該停止了嗎?怎么還會(huì)繼續(xù)運(yùn)行呢?
發(fā)表于 04-25 08:21
使用 請問是什么問題? 我以前理解的都是keil中局部變量都作為靜態(tài)變量分配地址的 。。。 難道局部變量keil能自動(dòng)優(yōu)化?
發(fā)表于 01-20 12:25
我都是按照教程上的兩種方法建的局部變量,但是建立局部變量后運(yùn)行標(biāo)志變成斷裂。我打開一個(gè)例子,例子里面有局部變量,可是當(dāng)我再建同樣的局部變量的時(shí)候發(fā)生了同樣的錯(cuò)誤現(xiàn)象。
發(fā)表于 07-23 22:56
大家好,我有一個(gè)困擾很久的問題。我想將一個(gè)循環(huán)里的數(shù)據(jù)引用到另一個(gè)定時(shí)循環(huán)結(jié)構(gòu)里,如果用局部變量的話會(huì)出現(xiàn)數(shù)據(jù)丟失,但實(shí)時(shí)性可以保證,如果用隊(duì)列的話保證了數(shù)據(jù)的完整性,但實(shí)時(shí)性做不到一致,會(huì)出現(xiàn)滯后,怎樣能讓數(shù)據(jù)和實(shí)時(shí)性都達(dá)到要
發(fā)表于 05-22 14:31
詳細(xì)介紹了static作用(修飾函數(shù)、局部變量、全局變量)的用法
發(fā)表于 11-17 10:30
?4次下載
全局變量是編程術(shù)語中的一種,源自于變量之分。變量分為局部與全局,局部變量又可稱之為內(nèi)部變量。
發(fā)表于 12-11 11:58
?3.3w次閱讀
1.靜態(tài)局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值;
2.靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲
發(fā)表于 03-14 14:28
?3152次閱讀
關(guān)于函數(shù)體內(nèi)局部變量定義的位置
發(fā)表于 03-14 11:43
?2849次閱讀
局部變量L:PLC內(nèi)部局部變量用英文字母L標(biāo)記,其作用與公共變量類似,但它是一種共用的、動(dòng)態(tài)變化的存儲區(qū)域,其內(nèi)容與含義隨著所執(zhí)行的邏輯塊的不同而改變,它用于寄存僅在邏輯塊內(nèi)部使用的中間運(yùn)算結(jié)果。
發(fā)表于 03-24 13:41
?5359次閱讀
本文檔的主要內(nèi)容詳細(xì)介紹的是LABVIEW初級教程之局部變量與全局變量的詳細(xì)資料說明。
發(fā)表于 03-29 15:00
?26次下載
臨時(shí)變量是臨時(shí)存儲在本地?cái)?shù)據(jù)區(qū)的變量。只有在執(zhí)行POU時(shí),才使用定義的臨時(shí)變量,而在執(zhí)行POU后,不再使用臨時(shí)變量的值。在主程序或中斷程序中,局部變
發(fā)表于 12-13 18:07
?5498次閱讀
局部變量是在函數(shù)內(nèi)部定義的變量,只能在函數(shù)內(nèi)部使用,函數(shù)執(zhí)行結(jié)束后,函數(shù)內(nèi)部的局部變量會(huì)被系統(tǒng)回收,不同的函數(shù),可以定義相同名稱的局部變量,相互之間沒有任何關(guān)聯(lián)
發(fā)表于 02-16 15:16
?946次閱讀
對于一個(gè)普通for循環(huán)而言,循環(huán)變量是局部變量。在大多數(shù)編程語言中,循環(huán)變量只在
發(fā)表于 11-23 14:50
?2939次閱讀
評論