Python中的变量是如何存储的——堆栈还是堆?
内存分配可以定义为将计算机内存中的一块空间分配给程序。在Python中,内存分配和释放方法是自动的,因为Python开发人员为Python创建了一个垃圾收集器,这样用户就不必手动进行垃圾收集。
垃圾收集
垃圾收集是解释器在不使用时释放内存以使其可用于其他对象的过程。
假设没有引用指向内存中的对象,即它没有被使用,虚拟机有一个垃圾收集器,它会自动从堆内存中删除该对象
注意:有关垃圾收集的更多信息,您可以参考这篇文章。
引用计数
引用计数通过计算一个对象被系统中其他对象引用的次数来工作。当对对象的引用被删除时,对象的引用计数会减少。当引用计数变为零时,对象被释放。
例如,假设有两个或多个具有相同值的变量,那么, Python虚拟机所做的是,而不是在私有堆中创建另一个具有相同值的对象,它实际上使第二个变量指向原来的那个私有堆中的现有值。因此,在类的情况下,拥有多个引用可能会占用大量内存空间,在这种情况下,引用计数非常有利于保留内存以供其他对象使用
例子:
# Literal 9 is an object
b = 9
a = 4
# Reference count of object 9
# becomes 0 and reference count
# of object 4 is incremented
# by 1
b = 4
Python中的内存分配
内存有两部分:
- 堆栈内存
- 堆内存
方法/方法调用和引用存储在堆栈内存中,所有值对象都存储在私有堆中。
堆栈内存的工作
分配发生在连续的内存块上。我们称之为堆栈内存分配,因为分配发生在函数调用堆栈中。编译器知道要分配的内存大小,每当调用函数时,它的变量都会在堆栈上分配内存。
它是仅在特定函数或方法调用内部需要的内存。调用函数时,会将其添加到程序的调用堆栈中。任何本地内存分配(例如特定函数内的变量初始化)都临时存储在函数调用堆栈中,一旦函数返回,它将被删除,调用堆栈继续执行下一个任务。编译器使用预定义的例程处理对连续内存块的分配,开发人员无需担心。
例子:
def func():
# All these variables get memory
# allocated on stack
a = 20
b = []
c = ""
堆内存的工作
内存是在执行程序员编写的指令期间分配的。请注意,heap 的名称与堆数据结构无关。之所以称为堆,是因为它是供程序员分配和取消分配的一堆内存空间。这些变量在方法或函数调用之外需要,或者在多个函数中共享,全局存储在堆内存中。
例子:
# This memory for 10 integers
# is allocated on heap.
a = [0]*10