Python裡出人意料的is運算子

2021-10-04 21:09:27 字數 1750 閱讀 8363

下面是乙個在網際網路上非常有名的例子:

>>> a = 256

>>> b = 256

>>> a is b

true

>>> a = 257

>>> b = 257

>>> a is b

false

>>> a = 257; b = 257

>>> a is b

true

is 和 == 的區別is 運算子檢查兩個運算物件是否引用自同一物件 (即, 它檢查兩個運算物件是否相同) == 運算子比較兩個運算物件的值是否相等

因此 is 代表引用相同, == 代表值相等.。下面的例子可以很好的說明這點:

>>>  == 

true

>>> is # 這兩個空列表位於不同的記憶體位址.

false

256 是乙個已經存在的物件,而 257 不是當你啟動python 的時候, 數值為 -5 到 256 的物件就已經被分配好了。這些數字因為經常被使用, 所以會被提前準備好。

python 通過這種建立小整數池的方式來避免小整數頻繁的申請和銷毀記憶體空間。

引用自

當前的實現為-5到256之間的所有整數保留乙個整數物件陣列, 當你建立了乙個該範圍內的整數時, 你只需要返回現有物件的引用。所以改變1的值是有可能的。我懷疑這種行為在python中是未定義行為. :-)

>>> id(256)

10922528

>>> a = 256

>>> b = 256

>>> id(a)

10922528

>>> id(b)

10922528

>>> id(257)

140084850247312

>>> x = 257

>>> y = 257

>>> id(x)

140084850247440

>>> id(y)

140084850247344

這裡直譯器並沒有智慧型到能在執行 y = 257 時意識到我們已經建立了乙個整數 257,所以它在記憶體中又新建了另乙個物件。

當 a 和 b 在同一行中使用相同的值初始化時,會指向同乙個物件。

>>> a, b = 257, 257

>>> id(a)

140640774013296

>>> id(b)

140640774013296

>>> a = 257

>>> b = 257

>>> id(a)

140640774013392

>>> id(b)

140640774013488

當 a 和 b 在同一行中被設定為 257 時, python 直譯器會建立乙個新物件,然後同時引用第二個變數。如果你在不同的行上進行, 它就不會 "知道" 已經存在乙個 257 物件了。

這是一種特別為互動式環境做的編譯器優化。當你在實時直譯器中輸入兩行的時候,他們會單獨編譯, 因此也會單獨進行優化。如果你在 .py 檔案中嘗試這個例子,則不會看到相同的行為,因為檔案是一次性編譯的。

mate40 出人意料的軟文營銷

上個月二十號,公司組織了一次團建,或許是因為部門裡的年輕人比較多,喜歡尋求刺激 又或許是因為吃膩了城裡的館子。最後選取了一片遠離市區的,還沒有被完全開發的山區作為最後的團建地點。我本人也是非常期待和看中這次團建的,為了更好地記錄這次團建時光,我甚至還帶上了上個星期剛買的華為mate40。這次團建也確...

我已經學完軟體測試,結果出人意料

18年,我畢業之後,從黑龍江來到北京,成為北漂中的一員,想通過自己努力,闖出一片天地。來到北京之後才發現在校所學的內容是沒有辦法找到合適工作的,所以只能先在超市幹著理貨的工作,薪水微薄,好歹能維持生活。自己在上大學期間以及在北漂的時候,也接觸過培訓,有同學培訓過,但是沒有上崗,所以自己的顧慮也是很大...

貪心演算法的乙個出人意料的應用

ibm ponder this上個月的題目比較有趣 我在心裡面想乙個2到166之間的整數 包括2和166 你的任務是用盡可能少的是非問句 我只能回答是或者否 猜出這個數除1以外的最小約數是多少。1 尋找一種策略使得在最壞情況下猜到答案的詢問次數最少。2 尋找一種策略使得在平均情況下猜到答案的期望詢問...