推 ckc1ark: 用==和is來比較跟mutable有什麼關係嗎 07/19 16:25
is 是比較物件相等性(id()), == 是比較內容相等性(__eq__); immutable 物件
在操作的時候會隱性的被 reassign 成另外一個物件,所以得用 == 來比較 built-in
的 immutable 物件。
None, True 跟 False 也是 immutable 物件,但它被實作成 const ,所以用 is
或是 == 來比較都可以。 (一般建議是用 is)
我記得沒錯的話 effective java 第三章是在講這個,有興趣可以看一下。
推 LessonWang: 因為用is的話 是看他們參考到的記憶體位址是否一樣 而 07/19 16:52
→ LessonWang: 用==只是看實質內容是否一樣 07/19 16:52
→ LessonWang: a='abc' b=a c='abc' 07/19 16:54
→ LessonWang: a is b ->True 07/19 16:54
→ LessonWang: a == b ->True 07/19 16:54
→ LessonWang: a is c ->False 07/19 16:54
→ LessonWang: a == c ->True 07/19 16:54
→ LessonWang: id(a) == id(b) ->True 07/19 16:55
→ LessonWang: 我都用id來看位址是否一樣 07/19 16:55
→ LessonWang: 不過 我還是得感謝u大和z大的整理和討論 07/19 16:56
※ 編輯: zerof (203.77.72.241), 07/21/2017 21:26:21
推 ckc1ark: 可以說一個和string不一樣 實質上不是mutable的case嗎? 07/22 11:52
→ ckc1ark: 好像只有你說的boolean算是? 07/22 11:54
→ zerof: int 也是 immutable 喔 07/23 11:13
推 ckc1ark: int也是用==在比較耶 用is只有-1~256可以而已 07/23 11:35
看錯你的問題... immutable 且 " 行為和 string 不一樣 " 的例子,除了 bool
以外, builtin constants 都是。但我不覺得行為和 string 不一樣就是了... 可以
用 is 來比較的原因是它是 constants ,所以用 == 比較的結果和 is 比較的結果是
一樣的。
※ 編輯: zerof (203.77.72.241), 07/23/2017 21:13:15
推 ckc1ark: 不好意思有點久沒看到 我的疑問就是 int和string一樣都是 07/28 01:56
→ ckc1ark: 要用==不能用is 所以int的case和string不同嗎? 實質上是? 07/28 01:57
→ ckc1ark: 我的想法是"實質上是mutable"並不是用==和is比較的原因 07/28 01:59
→ ckc1ark: 是原本就是兩個放在不同記憶體的物件 也就是id不同 07/28 01:59
→ zerof: 呃...你就視為一樣就好了 07/28 23:17