2016-07-04 86 views
35

两个变量在Python具有相同的id两个变量具有相同的ID,而不是列表或元组

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

如果我需要两个list S:

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

根据this link Senderle回答说,不可变的对象引用具有相同的ID,像列表这样的可变对象具有不同的ID。

所以现在根据他的回答,元组应该有相同的标识 - 意思是:

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

理想的情况下,元组是不可变的,它应该返回True,但它返回False

是什么解释?

+0

你有变量和对象(列表和元组)之间的区分 - 尽管有相同的列表,元组的元素时,你比较喜欢这两个对象你比较而不同的内存地址。 – dmitryro

+13

我认为你误解了你连接的答案。不同的不可变对象具有不同的ID。但对于小于256的整数(在大多数解释器中),该值预先加载到内存中,因此在第一个示例中,a是b –

+0

谢谢@JacquesGaudin!现在我对此有所了解。 –

回答

44

不可变对象不具有相同的id,并且事实上,对于您单独定义的任何类型的对象,这是不正确的。每当你用Python定义一个对象时,你都会用新的身份创建一个新的对象。

但是,对于小整数(-5到256之间)和小字符串(interned字符串,具有特殊长度(通常少于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 

而且由于有元组(其他类型),如果你确定任意大小,他们会得到自己的ID在这两个相同的元组没有这样的规则:

>>> 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 
+0

在上面提到的例子中(元组):a [1]是b [1]应该是True,为什么它返回False? –

+4

@Ram为什么你认为它应该返回True,它们是2个独立的对象(整数),但具有相同的值(不是id)。并注意它们不小于256. – Kasramvd

+1

是的,同意。我认为只有整数<256将返回ids()true。在python解释器中任何大于256的整数将有它自己的id空间,值将是相同的。 –

19

不可变!=相同的对象。*

An immutable object is simply an object whose state cannot be altered;就是这样。 当一个新对象被创建时,一个新地址将被分配给它因此,检查地址是否与is相同将返回False

事实上,1 is 1"a" is "a"回报True是Python的执行,由于integer caching和字符串interning所以不要让它迷惑你;它与所讨论的对象是可变/不可变的不相关。


*空不变对象do refer to the same object及其is内斯并返回true,这是一个特殊的实现特定的情况下,虽然。

15

看看这个代码:

>>> 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。内存中对象的图形表示将使您更深入地了解这个问题(我附上了屏幕截图)。

enter image description here

相关问题