您的问题与Python如何分配内存有关。 tldr; Python使用堆来存储内存。释放资源后,它会到达堆的顶部。
详细答案
Python必须分配内存来创建对象的实例。为了提高内存效率,Python内存管理器具有大量的内存位置,可用于为对象实例提供或保留对象。使用您的一些示例,您可以看到它在实践中是如何工作的。
例子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为该
堆的顶部 。在循环的下一次迭代中,python使用第一个可用的内存地址,该地址也是address
<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然后用于的内存地址在两个内存地址之间交替。



