Python有趣時刻,這些代碼讓你大呼"怎麼會這樣"

Python是一門清晰易學的語言,可是這不代表我們Python沒有黑暗料理,下面我就挑選了幾個能讓你大呼"什麼?怎麼會這樣"的程序,這些例子不光有趣,也能夠加深我們對於Python細節的理解,看看你自己能不能解釋吧。


20跟21有什麼區別


Python有趣時刻,這些代碼讓你大呼


第一次看到這個例子的時候我的心裡面充滿了震驚,20跟21有什麼區別為什麼結果不一樣?原因是,python在進行內部優化的時候會做常量替換的操作,也就是把 'a' * 20這種語句替換成'aaaaaaaaaaaaaaaaaaaa',這樣運行的時候節省時間,而剛好,小於等於20的時候會做這個優化,而大於20就不做這個優化了。


循環幾次?


Python有趣時刻,這些代碼讓你大呼


有些同學可能會猜只會循環一次,然後正確的輸出是


Python有趣時刻,這些代碼讓你大呼


循環了4次,所以i=10這個語句完全沒用了嗎?是的,這跟Python的for循環的機制有關,每次在循環體之前,下一個需要的值先會產生好然後賦值給循環變量,這裡的i。也就是說,雖然循環體中有一個i = 10,但下次循環前for又會做一個i=2或者i=3的操作,把i=10覆蓋了。


Python有趣時刻,這些代碼讓你大呼


嗼嗼嗼,這又是怎麼回事?這又引出了Python另一個優化機制,在解釋器開始的時候,會初始化-5到256這些數字,因為這些數字是常用的。所以a=256實際上是把a指向了已經創建好的256,b也同理。而257並沒有預先創建好,每一行的代碼在解釋器裡面又是單獨優化的,所以寫b=257的時候解釋器不知道已經有了一個257,又新建了一個,因此他們倆指向不同的object。但當在一行裡面同時給a b賦值為257的時候,解釋器優化知道這點,就只創建了一個257,所以a is b又是True了。補充說明一下,這個現象只存在於repl交互執行當中,如果你把這些語句寫在一個文件裡面運行,那麼編譯器會一起優化,所有的結果都是True了。


www.kudingmao.com


分享到:


相關文章: