![](/img/trans.png)
[英]Python: Check if two variables have the same content? Both Variables are unknown, can be DataFrames, lists of lists, etc
[英]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
被評估為True
而a is b
產生False
我強烈建議您在Online Python Tutor 中逐步運行上面的代碼片段。 內存中對象的圖形表示將使您更深入地了解這個問題(我附上了截圖)。
檢查下面的代碼.. tupil a和b在我們將其舊值分配回時保留其舊引用(ID)。 (但是,列表不會是這種情況,因為它們是可變的)
最初a和b具有相同的值( (1,2) ),但它們具有不同的 ID。 更改它們的值后,當我們將值 (1,2) 重新分配給a和b 時,它們現在引用的是他們自己的相同 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.