具有相同列表的两个变量具有不同的ID .....为什么?

时间:2014-12-13 15:05:43

标签: python list

尝试理解以下内容

为什么Python分配的ID对于相同的列表是不同的?

x = [1, 2, 3]
y = [1, 2, 3]

id(x) != id(y)
True

id(x)
11428848

id(y)
12943768

4 个答案:

答案 0 :(得分:3)

为什么这样做,如果你这样做:

l = [1, 2, 3]
m = [1, 2, 3]
l.append(4)

Ids不应该是相同的,并且不能为任何对象更改ID,因为它们识别它们。 所有可变对象都以这种方式工作。但是元组也是如此(这是不可改变的)。

编辑: 如下面所述,id可以在某些python实现中引用内存地址,但不是所有内容。

答案 1 :(得分:3)

Python中的每个不同的对象都有自己的ID。它与内容无关 - 它与存储描述对象的信息的位置有关。存储在不同位置的任何不同对象都将具有不同的ID。 (它是sometimes,但不是always,即对象的内存地址。)

这对于理解可变对象尤其重要 - 即可以更改的对象,如列表。如果可以更改对象,则可以创建具有相同内容的两个不同对象。它们将具有不同的ID,如果您稍后更改,则第二个不会更改。

对于整数和字符串等不可变对象,这不太重要,因为内容永远不会改变。即使两个不可变对象具有不同的ID,如果它们具有相同的内容,它们基本相同。

这套想法非常深刻。您可以将变量名称视为分配给ID号的标记,而ID号又可以唯一地标识对象。多个变量名称可用于标记同一对象。观察:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
4532949432
>>> id(b)
4533024888

那,你已经发现了。现在让我们创建一个新的变量名称:

>>> c = b
>>> id(c)
4533024888

尚未创建新对象。标有b的对象现在也标有c。当我们更改a时会发生什么?

>>> a[1] = 1000
>>> a
[1, 1000, 3]
>>> b
[1, 2, 3]
我们知道

ab是不同的,因为它们有不同的ID。因此,改变一个不会影响另一个。但是bc是同一个对象 - 还记得吗?所以......

>>> b[1] = 2000
>>> b
[1, 2000, 3]
>>> c
[1, 2000, 3]

现在,如果我为b分配一个新值,它不会改变对象本身的任何内容 - 只是它们被标记的方式:

>>> b = a
>>> a
[1, 1000, 3]
>>> b
[1, 1000, 3]
>>> c
[1, 2000, 3]

答案 2 :(得分:2)

那些列表不一样。它们可能包含相同的信息,但它们并不相同。如果你使y = x,你会发现实际上id是相同的。

答案 3 :(得分:1)

Python使用不同的ID保留可变变量,这就是原因。

您也可以使用不可变对象id来检查它;例如,一个元组。