代碼"python" is "python"
返回True
。但爲什麼(1,2,3) is (1,2,3)
返回False
?儘管兩者都是不可變的對象,但運算符的計算方式卻有所不同。爲什麼?爲什麼操作員爲不可變對象提供不同的輸出?
回答
如果兩個操作數引用同一個對象,則返回True。解釋器可以使用實體對象來實現不可變對象,但不能保證。
運營商is和不測試對象標識:x是y爲真當且僅當x和y是相同的對象。 x不是y產生逆真值。
您可以將身份認爲是內存中對象的地址。所以對於具有相同索引的2元組我們有不同的地址! 在這種情況下根據你的解釋和上面的東西,在你的解釋等於字符串指向一個內存地址
爲了更好地理解看到下面的演示:
>>> a=(0,1)
>>> b=a
>>> a is b
True
>>> c=(0,1)
>>> a is c
False
+1好答案。你可能會繼續解釋它對於可變對象和不可變對象都是一樣的。 – John1024 2014-10-04 08:17:24
因爲它沒有回答這個問題。您的演示不等同於OP的代碼。元組和字符串都是不可變的,爲什麼它們的行爲有所不同? – jonrsharpe 2014-10-04 08:19:09
感謝您的關注,我編輯答案! – Kasramvd 2014-10-04 15:41:21
的唯一原因,你的第一個例子是True
是從源代碼加載字符串字面值(我認爲這隻適用於單個文件中的字符串甚至)。
幾乎在除字符串文字之外的所有情況下,在不同時間創建的對象將具有不同的ID。
如果有任何疑問,X is Y
檢查是否X
和Y
refer to the same object。它確實不是檢查兩個對象是否相等。
現在你的問題:
通常你應該沒有關於是否A is A
回報True
或False
對於給定的文字A
任何期待。
我們很清楚CPython是如何在內部工作的,所以we can explain爲什麼每個特定情況的行爲方式如此。這就是說,除了在一些真正特殊的情況下,最好把它當作實現細節。在不同的Python解釋器中,或者實際上在不同版本的CPython中,它的行爲可能會有所不同。
當然,這並不意味着is
沒有用。這是,只是不是在這種情況下。
- 1. 爲什麼不可變的對象拋出UnboundLocalError但可變的對象不?
- 2. 爲什麼不同的操作員有不同的關聯性?
- 3. 爲什麼onclick監聽器會提供不同的輸出?
- 4. 爲什麼console.log和document.write爲相同的代碼提供不同的輸出?
- 5. 爲什麼輸出不同?
- 6. 爲什麼輸出不同?
- 7. 爲什麼它會爲每個值提供相同的輸出?
- 8. 神經網絡爲同一輸入提供不同的輸出
- 9. 爲什麼preg_replace會提供此輸出?
- 10. 爲什麼不可變類提供增變器?
- 11. 爲什麼超載操作員不會將主對象設置爲值集
- 12. 爲什麼PHP會提供意想不到的輸出?
- 13. 爲什麼格式化輸入輸出需要提供變量?
- 14. 爲什麼Google不提供浮動操作按鈕小部件?
- 15. 爲什麼TinyXPath在兩個不同的類中調用時爲同一個對象提供不同的結果?
- 16. 爲什麼類Test的兩個不同對象的變量爲==操作賦予true,並且對於String對象而言,相同的操作會導致爲false?
- 17. 爲什麼ActionMailer不能提供我的mongoid對象?
- 18. 爲什麼下面的代碼爲不同的執行提供不同的輸出
- 19. 爲什麼不同的C編譯器爲C程序提供不同的輸出?
- 20. 爲什麼`ObjectSpace._id2ref`在Ruby 1.9和Ruby 2.0上提供不同的輸出?
- 21. 爲什麼不||操作員爲我工作?
- 22. javascript:爲什麼缺少名字後。操作員提示出現
- 23. 爲什麼matplotlib不直接對對象進行操作?
- 24. 爲什麼我的不可變對象突變Scala
- 25. 爲什麼必須爲不同的屏幕密度提供不同的圖像?
- 26. 爲什麼java.nio.Paths.get(..)不將java.nio.Path對象作爲輸入?
- 27. uitextfield爲什麼不輸出可選項?
- 28. 爲什麼不增加對象變量?
- 29. 這些Date對象爲什麼不同?
- 30. 爲什麼會員提供商不是通用的?
'is'與不變性無關。 – simonzack 2014-10-04 08:07:42
第一個例子是你可以在代碼塊中調用常量的本地實習,[編譯器提供](https://hg.python.org/cpython/file/c0e311e010fc/Python/compile.c#l1075)(第1124行;這種情況下的字典是用於構建'co_consts')。這與全局字符串和整數實習是分開的,即不''1 2 3''不被實行,而'1 2 3'爲'1 2 3'。同樣,'1234567是1234567',儘管CPython全球實習人員只能達到256個。此外,'1.23456是1.23456'。 – eryksun 2014-10-04 12:58:05
@eryksun您應該將其寫爲答案 – jonrsharpe 2014-10-04 13:25:16