Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Python中具有相同值的可变对象具有不同的id_Python - Fatal编程技术网

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

为什么在Python中具有相同值的可变对象具有不同的id,python,Python,感谢您的宝贵时间,我刚刚开始学习Python。我遇到了可变和不可变的对象。 据我所知,可变对象可以在创建后更改 a = [1,2,3] print(id(a)) 45809352 a = [3,2,1] print(id(a)) 52402312 那么为什么同一列表“a”的id在其值更改时会更改。您的解释不正确 将新的列表分配给a时,会更改其引用 另一方面,你可以做: a[:] = [3,2,1] 然后引用将不会更改。可变表示对象的内容已更改。例如,a.append(4)实际上使a等于[1,

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

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

那么为什么同一列表“a”的id在其值更改时会更改。

您的解释不正确

将新的
列表
分配给
a
时,会更改其引用

另一方面,你可以做:

a[:] = [3,2,1]
然后引用将不会更改。

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


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

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

例如:

当你这样做的时候

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

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


    任务不是变异。可能是@Kevin的重复。谢谢。现在我理解了变异的概念。你把它与“追加到字符串”相比不是很好,因为字符串没有
    append
    方法。您只能执行
    string+“foo”
    ,这将创建一个新字符串,但
    [1,2,3]+[4]
    也是如此
    str.replace
    可能是一个更好的例子。@tobias_k:好的,不是字面意思,只是想传达这个想法。在其他语言中有一个append,但它的主要思想仍然是创建一个新对象
    a = [3, 2, 1]
    
    >>> 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