Python 更改列表:指定给的变量不会更改;id";用于后续更改的变量

Python 更改列表:指定给的变量不会更改;id";用于后续更改的变量,python,Python,这和预期的一样吗?我认为在Python中,变量是指向内存中对象的指针。如果修改变量指向的python列表一次,内存引用就会改变。但是如果我再次修改它,内存引用是相同的吗 >>> id(mylist) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'mylist' is not defined >&g

这和预期的一样吗?我认为在Python中,变量是指向内存中对象的指针。如果修改变量指向的python列表一次,内存引用就会改变。但是如果我再次修改它,内存引用是相同的吗

>>> id(mylist)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mylist' is not defined
>>> mylist = [0]
>>> id(mylist)
4417893152
>>> mylist = [0, 1]
>>> id(mylist)
4418202992 # ID changes
>>> mylist.append(3)
>>> mylist
[0, 1, 3]
>>> id(mylist)
4418202992 # ID stays the same
>>> mylist.append(4)
>>> mylist
[0, 1, 3, 4]
>>> id(mylist)
4418202992 # ID stays the same
>>>
>id(mylist)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“mylist”
>>>mylist=[0]
>>>id(mylist)
4417893152
>>>mylist=[0,1]
>>>id(mylist)
4418202992#ID更改
>>>mylist.append(3)
>>>迈利斯特
[0, 1, 3]
>>>id(mylist)
4418202992#ID保持不变
>>>mylist.append(4)
>>>迈利斯特
[0, 1, 3, 4]
>>>id(mylist)
4418202992#ID保持不变
>>>

内存引用应该更改,这是正确的。仔细看看内存地址:它们不完全相同


编辑:关于编辑,内存地址仅在重新分配变量时更改。如果更改列表,变量的内存将保持不变。

查看您提供的id。有完全不同的。4338643744 != 4338953744.看前5个数字:43386!=43389由于内存引用发生了正确的更改,所以一切都正常工作。

内存地址不相同。它的表现与预期相符-

mylist=['123']
-->指向内存地址4338643744(请参见中间的8643)

mylist=['123','a']
-->指向内存地址4338953744


对于可变对象,作为指定对象的唯一标识符的
id
将基于值本身


refere

无法复制。我无法在我的机器上复制,因此我认为这是解释器采用快捷方式的结果(或者重用相同的内存块,因为它恰好已初始化为正确的内容,并且无论如何都会被垃圾收集)或者垃圾收集器在赋值中间删除旧的引用。CPython中的ID是基于内存地址的,当您重写引用时,为什么不使用相同的内存进行优化呢?在其他机器、操作系统或周三晚上满月时可能会有所不同。看起来这是例外行为。从python:
两个生命周期不重叠的对象可能具有相同的id()值。
。我可以在我的机器上复制,这只是一个编译器优化。对我来说,将变量重新分配给其初始化值会更改变量的id,但将其分配给其初始化值并附加一些项目不会更改。这表明编译器重复使用相同的内存地址,只需在之后写入内存。谢谢,是的,你说得对。而且,我再次测试了它。内存引用似乎“有时”会改变。我会用我的新结果更新原始问题。这有点误导,因为内存地址不必根据文档进行更改(参见上面的注释)。