我想知道Python中列表和普通变量的内存地址

2024-04-26 05:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个变量中存储一个值,在另一个变量中存储相同的值,然后它为两个变量提供相同的id。但如果我将一个列表分配给一个变量,将同一个列表分配给另一个ID不同的变量,为什么?你知道吗

我的示例程序是:

>>> x=10
>>> y=10
>>> id(x)
21122368
>>> id(y)
21122368


>>> x=[1,2,3]
>>> y=[1,2,3]
>>> id(x)
35525896
>>> id(y)
35527736

Tags: 程序id示例列表
2条回答

python中缓存了一些不可变的对象,例如一些数字和字符串。这意味着,当您编写1时,您会得到一个对堆上已经存在的对象的引用。你知道吗

列表不会被缓存(从它们是可变的这一事实出发,这没有什么意义),因此它们具有不同的标识,尽管它们的内容可以相等。你知道吗

也许比较一下会有帮助。每一个看月亮的人,看到的都是同一个月亮(那就是得到一个1的参照物)。。。所以你可以这么说

id(my_moon) == id(your_moon)

或者只是

my_moon is your_moon

因为月亮就是月亮,而1就是1,一些python实现出于性能原因决定缓存这个对象。你知道吗

另一方面,可变对象是缓存的可怕候选对象。例如,每个人拿一袋薯片,是拿一袋薯片的不同的例子,因此在某个时候可能是这样

my_chips == your_chips

因为他们有相同数量的芯片,但无论如何都不会

id(my_chips) == id(your_chips)

因为这意味着这个对象是共享的,当其他人吃了一个芯片(改变了芯片包对象)时,一个芯片就会从你的包里消失。。。那将是一个可怕的世界:)

这是因为在最流行的Python实现中进行了优化。基本上,小整数不是作为完整对象创建的,而是接收到对现有小整数的引用,每次都是相同的。你知道吗

相关问题 更多 >