亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“是”運算符與整數意外行為

“是”運算符與整數意外行為

MYYA 2019-05-22 14:29:59
“是”運算符與整數意外行為為什么以下在Python中出現意外行為?>>> a = 256>>> b = 256>>> a is bTrue           # This is an expected result>>> a = 257>>> b = 257>>> a is bFalse          # What happened here? Why is this False?>>> 257 is 257True           # Yet the literal numbers compare properly我使用的是Python 2.5.2。嘗試一些不同版本的Python,似乎Python 2.3.3顯示了99到100之間的上述行為?;谝陨纤?,我可以假設Python在內部實現,使得“小”整數以不同于大整數的方式存儲,并且is運算符可以區分。為什么泄漏抽象?當我不知道它們是否是數字時,比較兩個任意對象以查看它們是否相同的更好的方法是什么?
查看完整描述

5 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊


看看這個:


>>> a = 256

>>> b = 256

>>> id(a)

9987148

>>> id(b)

9987148

>>> a = 257

>>> b = 257

>>> id(a)

11662816

>>> id(b)

11662828

編輯:這是我在Python 2文檔中找到的,“普通整數對象”Python 3也是如此):

當前實現為-5到256之間的所有整數保留一個整數對象數組,當您在該范圍內創建一個int時,實際上只返回對現有對象的引用。因此應該可以更改值1.我懷疑在這種情況下Python的行為是未定義的。:-)


查看完整回答
反對 回復 2019-05-22
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

這取決于你是否想要看兩件事是否相同,或者是同一個對象。


is檢查它們是否是同一個對象,而不僅僅是相同的。小的int可能指向相同的內存位置以提高空間效率


In [29]: a = 3

In [30]: b = 3

In [31]: id(a)

Out[31]: 500729144

In [32]: id(b)

Out[32]: 500729144

您應該==用來比較任意對象的相等性。您可以使用__eq__和__ne__屬性指定行為。


查看完整回答
反對 回復 2019-05-22
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

由于您可以檢查源文件intobject.c,因此Python會緩存小整數以提高效率。每次創建對小整數的引用時,都指的是緩存的小整數,而不是新對象。257不是一個小整數,因此它被計算為一個不同的對象。

最好是==為此目的使用。


查看完整回答
反對 回復 2019-05-22
  • 5 回答
  • 0 關注
  • 737 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號