gpt4 book ai didi

python - 不同的类实例使用相同的内存位置

转载 作者:太空狗 更新时间:2023-10-30 00:29:14 34 4
gpt4 key购买 nike

我在使用 pickle 库时,注意到有时不同的类实例位于相同的内存位置。

以下两个示例都展示了上述行为:

class DemoClass:
def __init__(self):
self.name = 'demoName'

#example 1
for i in range(3):
print (DemoClass())

#example 2
[print(DemoClass()) for i in range(3)]

#Output for both example 1 and example 2
#Note that the memory locations are identical in the output
<__main__.DemoClass object at 0x00CEE610>
<__main__.DemoClass object at 0x00CEE610>
<__main__.DemoClass object at 0x00CEE610>

这让我很吃惊,所以也许你可以解释为什么会这样

程序按照我的预期运行的方式如下。

demo = [DemoClass() for i in range(3)]
for i in demo:
print (i)

#Output
<__main__.DemoClass object at 0x01F7E630>
<__main__.DemoClass object at 0x01F7ED30>
<__main__.DemoClass object at 0x01F7E670>

最佳答案

您的问题涉及 Python 如何分配内存。 tldr; Python 使用堆来存储内存。当资源被释放时,它会到达堆的顶部。

详细解答

Python 必须分配内存来创建对象的实例。为了提高内存效率,Python memory manager有一堆内存位置可用于为对象的实例化提供或保留。使用您的一些示例,您可以了解这在实践中是如何工作的。

示例#1

>>> for i in range(3):
... print(DemoClass())
...
<test.DemoClass instance at 0x288b248>
<test.DemoClass instance at 0x288b248>
<test.DemoClass instance at 0x288b248>

for 的第一次迭代中循环,python使用当前堆中的第一个可用地址,即<0x288b248> , 创建 DemoClass 的实例对于 print称呼。一旦print命令完成后,内存地址被释放并返回到堆顶。在循环的下一次迭代中,python 使用第一个可用的内存地址,这也是地址 <0x288b248> .等等

示例#2

>>> for j in [DemoClass() for i in range(3)]:
... print(j)
...
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>
<test.DemoClass instance at 0x288b638>

这里 python 生成一个列表,然后它将遍历该列表。创建列表需要为每个元素创建 DemoClass 的实例。这将从堆中取出前三个地址。循环完成后,列表从内存中释放,如果我们再次调用 print(DemoClass)我们会发现 python 再次重用内存。

>>> print DemoClass()
<test.DemoClass instance at 0x288bcf8>

示例 3(我的交替内存分配示例)

>>> for i in range(4):
... Demo = DemoClass()
... print(Demo)
...
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>
<test.DemoClass instance at 0x288bcf8>
<test.DemoClass instance at 0x288b290>

在这个例子中,每次Demo被实例化为 DemoClass 的一个实例,一段内存分配给Demo .然而,调用 print(Demo) 释放分配给Demo的内存.在下一个循环开始时,一个新的内存段被分配给Demo。然后 Demo覆盖,此时它的原始内存地址返回到堆的顶部。用于Demo的内存地址然后在两个内存地址之间交替。

关于python - 不同的类实例使用相同的内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514829/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com