你的问题涉及Python如何分配内存。tldr;Python 使用堆来存储内存。当资源被释放时,它会到达堆的顶部。
详细解答
Python 必须分配内存来创建对象的实例。为了提高内存效率,Python内存管理器 https://docs.python.org/3/c-api/memory.html有一堆内存位置可用于为对象的实例化提供或保留。使用一些示例,您可以了解这在实践中是如何运作的。
例子#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>
. Etc.
例子#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 生成一个列表,然后对其进行迭代。创建列表需要new为每个元素创建 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)
does not释放分配给的内存Demo
。在下一个循环开始时,分配一个新的内存段Demo
进而Demo
is 被覆盖,此时它的原始内存地址返回到堆顶部。使用的内存地址Demo
然后在两个内存地址之间交替。