回複內容:
題主想的“逐行解釋”與“整體解釋”的差異的思路是對的,不過細節不太對。下面講點細節。
跟Sublime、IDLE啥的沒關係。
$ pythonPython 2.7.5 (default, Mar 9 2014, 22:15:05) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> a = 10.1>>> b = 10.1>>> a is bFalse>>> id(a)140475784803760>>> id(b)140475784803736>>> (10.1) is (10.1)True>>> def foo():... a = 10.1... b = 10.1... return a is b... >>> foo()True
is 是判斷identity的,如果兩個變數 id (address)相同,那麼a is b就是True;
所以從執行結果來看,也是符合的。
至於問題中的差別,那就是實現相關的,像10.1這樣的small number是否再次賦值會複用id那是實現相關的(我的2.7.6是不同的id);我估計可能sublime本身內建有python的運行時(不太確定,我不大用sublime),所以會出現不同的表現。給自己埋個坑,今天突然想到了一種可能,由於IDLE是逐條解釋命令的,而python中的浮點數儲存在堆記憶體中,每次建立一個浮點數,都會直接將堆記憶體位址壓棧,建立相同浮點數時,IDLE也會執行重複動作;而當寫到指令碼中,用解譯器執行時,碰到簡單的數值對象,就會檢查是否已經存在該對象(數值對象重複判斷比較簡單),從而直接將存在的堆地址壓棧即可。
應該是python的解譯器存在朱濤所說的運行時,究竟如何要以後看瞭解釋器的實現過程才明白了。等以後填坑。