【问题标题】:why mutable objects having same value have different id in Python为什么具有相同值的可变对象在 Python 中具有不同的 id
【发布时间】:2017-01-31 22:50:35
【问题描述】:

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

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

那么为什么同一个列表“a”的id在其值发生变化时会发生变化。

【问题讨论】:

标签: python


【解决方案1】:

你的解释不正确。

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

另一方面,你可以这样做:

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

然后引用不会改变。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您与“附加到字符串”的比较不太好,因为字符串没有append 方法。您只能执行string + "foo",这将创建一个新字符串,但[1,2,3] + [4] 也是如此。 str.replace 可能是一个更好的例子。
    • @tobias_k:好的,不是字面意思,只是想传达这个想法。在其他语言中,有一个追加,但主要思想仍然是创建一个新对象
    【解决方案3】:

    如果您更改列表,其 id 不会更改。但是你可能会做一些事情,而不是创建一个新列表,然后它也会有一个新的 id。

    例如,

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

    【讨论】:

      【解决方案4】:

      当你这样做时

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-01
          • 2016-01-03
          • 2013-05-19
          • 1970-01-01
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 2019-12-19
          • 2016-02-13
          相关资源
          最近更新 更多