2013年5月8日 星期三

python 中 is 和 ==(等於) 的差別

    在很多程式語言中,相等的意義有兩種意涵,一種是指那兩個變數實際上是指向同一個物件,另外一種意涵是雖然他們不是相同物件,但是他們的值一樣(什麼叫做值一樣,可以自己寫函數定義)。在 java 中,我們用 == 還比較這兩個變數是否指向相同物件,而使用 object.equal(other) 還比較兩個變數物件的值是否一樣。 在 python 中,則是使用 is 這個關鍵字來判斷這兩個變數是否指向相同物件,而使用 == 來判斷兩個變數物件的值是否一樣(值是否一樣由 __eq__ 這個函數定義)

    在 google python style guide 的 True/False evaluations。有提到 Never use == or != to compare singletons like None. Use is or is not.。這句話說對了一半。事實上, True 和 False 這兩個物件也是 singletons。可是如果你這樣寫 if test() is True,你大概會被說你不會寫 python。你可以用 id(True) 來判斷 True 是否都是同一個物件,你會發現它都是在同一個位址上。

    事實上,我個人不是很喜歡 Use the "implicit" false if at all possible. 這個規則就是了。我比較喜歡明確的寫法。例如, if len(a) > 0,這句話明確的告訴 a 必須實作 __len__ 方法,且這個方法的回傳值要大於零時,結果才會是 True。 if a 實際上的意涵等同 if bool(a) ,他的意思是 a 有實作 __nozero__ ,且這個方法的回傳值是 True。後者透露出來的資訊較前者少。當然,如果故意要隱藏實作細節的話,後者比前者優就是了。

沒有留言:

張貼留言