2018年3月25日 星期日

Python: Interesting Python codes (== and is)

最近發現兩個跟python相關且有趣的code:

第一個:

首先看下方的程式好像很正常:

但是如果變數a與b的值大一點:

ㄟ.......怎會這樣?
找答案前先來看一下id()這個指令:
執行後會回傳變數的記憶體位置。
所以我們看一下a, b記憶體的位置:



所以我們可以看到a與b的值是一樣的,所以a == b當然是對(True)的,但"a is b"必須考量記憶體的位置必須相同,所以當然就是錯(False)的囉。這感覺有點類似於C裡面的指標。
或者是說,只要 == 兩邊的值是一樣的,a == b就是True,但a與b是不同物件,所以如果使用"is",必須是同個物件才是True,否則就是False。

同樣的,我們可以類推類似的結果於list上:

不過還有一個問題沒解決,就是為什麼數字小的"is"跟"=="的結果就是一樣的?
這是因為python為了效率,將-5至256的integer置於cache(快取),所以這些int是指向同一個記憶體位置的,例如下方的例子:


所以既然記憶體位置都一樣,"a is b"當然也是True,不過記得如上述的例子,只要值小於256,更精確的說是-5到256的值是比較特殊的,結果就不同囉!!!我想這邊真的要小心,否則寫出程式很容易有bug。

第二個:

>>> a = range(2,6)
>>> print(a)

會輸出哪個結果?
是 2,3,4,5 還是 range(2,6)??

答案是:
range(2,6)

因為range()必須透過iteration執行,但print()只執行一次,所以當然結果就是range()本身的指令了。


沒有留言:

張貼留言