我想知道python中列表和普通变量的内存位置[重复]

Posted

技术标签:

【中文标题】我想知道python中列表和普通变量的内存位置[重复]【英文标题】:I want to know the memory location for a list and normal variable in python [duplicate] 【发布时间】:2016-08-14 05:36:30 【问题描述】:

我将一个值存储在一个变量中,并将相同的值存储在另一个变量中,然后它为两个变量提供相同的 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

【问题讨论】:

因为它是一个不同的列表,你在其中放置了相同的内容。 整数是不可变的,因此无论是否重用都没有区别。然而,列表是可变的,并且必须是单独的实例才能提供预期的行为。 它可能是数十个(字面意思)类似问题的重复。 我忘了提,而 Python 程序员可能需要知道 object 的内存位置(注意我没有写 variable ),因此在语言中包含 id(),它们通常不会。 如果是这种情况,您所说的不可变和 nutable 的行为会有所不同,字符串也是不可变的,但对于字符串,我分配的内存位置相同 【参考方案1】:

这是由于最流行的 Python 实现中的优化所致。基本上,小整数不会被创建为完整的对象,而是您会收到对现有小整数的引用,并且每次都是同一个。

【讨论】:

【参考方案2】:

一些不可变对象被缓存在python中,例如一些数字和字符串。这意味着,当您编写 1 时,您将获得对堆上已存在的对象的引用。

列表没有被缓存(没有什么意义,因为它们是可变的),因此它们具有不同的身份,尽管它们可以在内容上相同。

也许稍微比较会有所帮助。每个看月亮的人都看到了同一个月亮(这将得到对1的引用)......因此你可以这么说

id(my_moon) == id(your_moon)

或者只是

my_moon is your_moon

由于月亮就是月亮,而11,python 的一些实现出于性能原因决定缓存这个对象。

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

my_chips == your_chips

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

id(my_chips) == id(your_chips)

因为这意味着对象是共享的,并且当其他人吃下芯片(改变芯片包对象)时,芯片会从您的包中消失......这将是一个可怕的世界:)

【讨论】:

如果是这种情况,您所说的不可变和 nutable 的行为会有所不同,字符串也是不可变的,但对于字符串,我分配的内存位置相同 例子:>>> x="s" >>> y="s" >>> id(x) 21122368 >>> id(y) 21122368 我不明白你的评论。出于性能原因(这取决于实现),Python VM 缓存了一些不可变对象。有时会缓存字符串和整数,这就是您的情况。这就是为什么1 is 1's' is 's'

以上是关于我想知道python中列表和普通变量的内存位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章

参数变量存储在内存中的啥位置?

如何在php中检查变量的内存位置?

Python 高级面向对象

python面向对象(进阶篇)

python自动化开发学习-8 面向对象进阶

好好学python·函数