总有些代码会让你大呼“我勒个去,怎么会这样子“
Python是一門清晰易學(xué)的語言,可是這不代表我們Python沒有黑暗料理,下面我就挑選了幾個(gè)能讓你大呼"我勒個(gè)去,怎么會這樣"的程序,這些例子不光有趣,也能夠加深我們對于Python細(xì)節(jié)的理解,看看你自己能不能解釋吧。
本文取材于下面這個(gè)GitHub repository。
【github.com/satwikkansal/wtfpython】自己在前面加HTTP
以下代碼如果不信請手動(dòng)嘗試,測試環(huán)境:Python 3.6
20跟21有什么區(qū)別
第一次看到這個(gè)例子的時(shí)候我的心里面充滿了wtf,20跟21有什么區(qū)別為什么結(jié)果不一樣?原因是,python在進(jìn)行內(nèi)部優(yōu)化的時(shí)候會做常量替換的操作,也就是把 'a' * 20這種語句替換成'aaaaaaaaaaaaaaaaaaaa',這樣運(yùn)行的時(shí)候節(jié)省時(shí)間,而剛好,小于等于20的時(shí)候會做這個(gè)優(yōu)化,而大于20就不做這個(gè)優(yōu)化了。。。
讓一個(gè)函數(shù)Return兩次
一般的Python教程會告訴你,當(dāng)函數(shù)執(zhí)行到第一個(gè)return的時(shí)候會退出,剩下的語句不再執(zhí)行。然而如果是這樣的話上面的代碼中我們的somefunc()應(yīng)該返回的是'from_try',但結(jié)果卻不是。這個(gè)現(xiàn)象的原因是finally后面的語句永遠(yuǎn)會執(zhí)行,而函數(shù)的返回值由最后一個(gè)return語句決定,所以函數(shù)的返回值是finally語句中的返回值。
循環(huán)幾次?
你猜下面的代碼會循環(huán)幾次
有些同學(xué)可能會猜只會循環(huán)一次,然后正確的輸出是
循環(huán)了4次,所以i=10這個(gè)語句完全沒用了嗎?是的,這跟Python的for循環(huán)的機(jī)制有關(guān),每次在循環(huán)體之前,下一個(gè)需要的值先會產(chǎn)生好然后賦值給循環(huán)變量,這里的i。也就是說,雖然循環(huán)體中有一個(gè)i = 10,但下次循環(huán)前for又會做一個(gè)i=2或者i=3的操作,把i=10覆蓋了。如果大家對Python感興趣的話,可以加一下我的威信哦:abb436574,免費(fèi)領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
一石三鳥
現(xiàn)在我們賦個(gè)值給第一個(gè)元素,再看看結(jié)果
What?為什么有三個(gè)元素都變成了X,我們明明值賦了一個(gè)值啊?這是因?yàn)閇row] * 3這個(gè)操作實(shí)際上沒有復(fù)制row,而只是創(chuàng)建了三個(gè)object reference,也就是board[0] board[1] board[2]這三個(gè)元素其實(shí)指向了同一個(gè)列表row,那么改變board[0][0]其實(shí)就是改變r(jià)ow[0],也同時(shí)改變了board[1][0] board[2][0]。
又是數(shù)字,256和257有什么區(qū)別?
論捐嗼,這又是怎么回事?這又引出了Python另一個(gè)優(yōu)化機(jī)制,在解釋器開始的時(shí)候,會初始化-5到256這些數(shù)字,因?yàn)檫@些數(shù)字是常用的。所以a=256實(shí)際上是把a(bǔ)指向了已經(jīng)創(chuàng)建好的256,b也同理。而257并沒有預(yù)先創(chuàng)建好,每一行的代碼在解釋器里面又是單獨(dú)優(yōu)化的,所以寫b=257的時(shí)候解釋器不知道已經(jīng)有了一個(gè)257,又新建了一個(gè),因此他們倆指向不同的object。但當(dāng)在一行里面同時(shí)給a b賦值為257的時(shí)候,解釋器優(yōu)化知道這點(diǎn),就只創(chuàng)建了一個(gè)257,所以a is b又是True了。補(bǔ)充說明一下,這個(gè)現(xiàn)象只存在于repl交互執(zhí)行當(dāng)中,如果你把這些語句寫在一個(gè)文件里面運(yùn)行,那么編譯器會一起優(yōu)化,所有的結(jié)果都是True了。
總結(jié)
以上是生活随笔為你收集整理的总有些代码会让你大呼“我勒个去,怎么会这样子“的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟图书管理系统的完整代码
- 下一篇: 如何将.py文件转换为.exe