尝试理解以下内容
为什么Python分配的ID对于相同的列表是不同的?
x = [1, 2, 3]
y = [1, 2, 3]
id(x) != id(y)
True
id(x)
11428848
id(y)
12943768
答案 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]
我们知道 a
和b
是不同的,因为它们有不同的ID。因此,改变一个不会影响另一个。但是b
和c
是同一个对象 - 还记得吗?所以......
>>> 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
来检查它;例如,一个元组。