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

SQL*_*kie 7 python list

试图了解以下内容

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

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

id(x) != id(y)
True

id(x)
11428848

id(y)
12943768
Run Code Online (Sandbox Code Playgroud)

sen*_*rle 4

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

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

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

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

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
4532949432
>>> id(b)
4533024888
Run Code Online (Sandbox Code Playgroud)

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

>>> c = b
>>> id(c)
4533024888
Run Code Online (Sandbox Code Playgroud)

没有创建新对象。标记为 的对象b现在也标记为c。当我们改变时会发生什么a

>>> a[1] = 1000
>>> a
[1, 1000, 3]
>>> b
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

ab是不同的,正如我们所知,因为它们具有不同的 ID。因此,其中一个的更改不会影响另一个。但是bc是同一个对象——还记得吗?所以...

>>> b[1] = 2000
>>> b
[1, 2000, 3]
>>> c
[1, 2000, 3]
Run Code Online (Sandbox Code Playgroud)

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

>>> b = a
>>> a
[1, 1000, 3]
>>> b
[1, 1000, 3]
>>> c
[1, 2000, 3]
Run Code Online (Sandbox Code Playgroud)