我想知道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
由于月亮就是月亮,而1
是1
,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中列表和普通变量的内存位置[重复]的主要内容,如果未能解决你的问题,请参考以下文章