为什么具有相同值的可变对象在Python中具有不同的id

why mutable objects having same value have different id in Python

感谢您宝贵的时间,我刚刚开始学习Python。我遇到了易变和不变的物体。据我所知,可变对象在创建后可以更改。

1
2
3
4
5
6
a = [1,2,3]
print(id(a))
45809352
a = [3,2,1]
print(id(a))
52402312

那么,为什么同一个列表"a"的ID在其值更改时会发生更改。


你的解释不正确。

当您将新的list分配给a时,您将更改其引用。

另一方面,你可以做到:

1
a[:] = [3,2,1]

然后参考不会改变。


可变表示对象的内容已更改。例如,a.append(4)实际上使a等于[1, 2, 3, 4],相反,附加到字符串(不可变)不会改变它,而是创建一个新的字符串。

但是,当您重新分配时,您会创建一个新对象并将其分配给a,您不会更改a的现有内容。以前的内容丢失(除非被其他变量引用)


不可变并不意味着你分配了一个新的对象,它意味着你的原始对象可以"就地"更改,例如通过.append()

1
2
3
4
5
6
7
8
9
10
11
>>> my_list = [1,2,3]
>>> id(my_list)
140532335329544
>>> my_list.append(5)
>>> id(my_list)
140532335329544
>>> my_list[3] = 4
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140532335329544

当你这样做的时候

1
a = [3, 2, 1]
  • 将[1,2,3]的列表与变量a取消链接。
  • 创建一个新的列表[3,2,1],然后将其分配给a变量。

  • 如果更改列表,则其ID不会更改。但是你可以做一些事情来创建一个新的列表,然后它也会有一个新的ID。

    例如。,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> l=[]
    >>> id(l)
    140228658969920
    >>> l.append(3)  # Changes l
    >>> l
    [3]
    >>> id(l)
    140228658969920  # Same ID
    >>> l = l + [4]  # Computes a new list that is the result of l + [4], assigns that
    >>> l
    [3, 4]
    >>> id(l)
    140228658977608  # ID changed