簡體   English   中英

Python 中的兩個變量具有相同的 id,但不是列表或元組

[英]Two variables in Python have same id, but not lists or tuples

Python 中的兩個變量具有相同的id

a = 10
b = 10
a is b
>>> True

如果我拿兩個list

a = [1, 2, 3]
b = [1, 2, 3]
a is b
>>> False

根據此鏈接, Senderle 回答說不可變對象引用具有相同的 id,而像列表這樣的可變對象具有不同的 id。

所以現在根據他的回答,元組應該具有相同的 ID - 意思是:

a = (1, 2, 3)
b = (1, 2, 3)
a is b
>>> False

理想情況下,由於元組不可變,它應該返回True ,但它返回False

解釋是什么?

不可變對象沒有相同的id ,事實上,對於您單獨定義的任何類型的對象,這都不是真的。 一般來說,每次在 Python 中定義一個對象時,都會創建一個具有新標識的新對象。 然而,為了優化(大部分),對於小整數(-5 到 256 之間)和具有特殊長度的中間字符串有一些例外——通常小於 20 個字符—— *它們是單例並具有相同的id (實際上是一個具有多個指針的對象)。 您可以像下面這樣檢查:

>>> 30 is (20 + 10)
True
>>> 300 is (200 + 100)
False
>>> 'aa' * 2 is 'a' * 4
True
>>> 'aa' * 20 is 'a' * 40
False

對於自定義對象:

>>> class A:
...    pass
... 
>>> A() is A() # Every time you create an instance you'll have a new instance with new identity
False

另請注意, is運算符將檢查對象的身份,而不是值。 如果你想檢查你應該使用的值==

>>> 300 == 3*100
True

並且由於元組或任何可變類型沒有這樣的優化或實習規則,如果你定義兩個相同大小的元組,它們將獲得自己的身份,因此不同的對象:

>>> a = (1,)
>>> b = (1,)
>>>
>>> a is b
False

還值得一提的是,即使在迭代器中定義了“單例整數”和“內部字符串”的規則也是如此。

>>> a = (100, 700, 400)
>>>
>>> b = (100, 700, 400)
>>>
>>> a[0] is b[0]
True
>>> a[1] is b[1]
False

* 關於此的一篇很好的詳細文章: http : //guilload.com/python-string-interning/

不可變!=同一個對象。 *

不可變對象只是狀態不能改變的對象; 這就是全部。 當一個新對象被創建時,一個新的地址將被分配給它 因此,檢查地址是否與is相等將返回False

1 is 1"a" is "a"返回True的事實是由於 Python 執行的整數緩存和字符串實習,所以不要讓它混淆你; 它與可變/不可變的對象無關。


*空的不可變對象確實引用了同一個對象,並且它們的is ness 確實返回 true,不過這是一個特殊的實現特定情況。

看看這段代碼:

>>> a = (1, 2, 3)
>>> b = (1, 2, 3)
>>> c = a
>>> id(a)
178153080L
>>> id(b)
178098040L
>>> id(c)
178153080L

為了弄清楚為什么a is c被評估為Truea is b產生False我強烈建議您在Online Python Tutor 中逐步運行上面的代碼片段。 內存中對象的圖形表示將使您更深入地了解這個問題(我附上了截圖)。

在此處輸入圖片說明

檢查下面的代碼.. tupil ab在我們將其舊值分配回時保留其舊引用(ID)。 (但是,列表不會是這種情況,因為它們是可變的)

最初ab具有相同的值( (1,2) ),但它們具有不同的 ID。 更改它們的值后,當我們將值 (1,2) 重新分配給ab 時,它們現在引用的是他們自己的相同 ID(分別為 88264264 和 88283400)。

>>> a = (1,2)
>>> b = (1,2)
>>> a , b
((1, 2), (1, 2))
>>> id(a)
88264264
>>> id(b)
88283400
>>> a = (3,4)
>>> b = (3,4)
>>> id(a)
88280008
>>> id(b)
88264328
>>> a = (1,2)
>>> b = (1,2)
>>> id(a)
88264264
>>> id(b)
88283400
>>> a , b
((1, 2), (1, 2))
>>> id(a) , id(b)
(88264264, 88283400)
>>> 

**檢查鏈接為什么元組在分配相同的值時不會獲得相同的 ID? 也是在讀完這篇之后。 這里還討論了另一個案例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM