好吧,我有一个类的概念,允许其他类在基础上导入类,而如果你使用它,你必须导入它。我将如何实施它?或者,Python解释器是否已经以某种方式执行此操作?它是否会破坏内存中未使用的类,以及如何?
我知道C ++ / C是非常面向内存的指针和所有这些,但是Python?而且我不是说我有问题;我或多或少想要为我的程序设计做一个修改。我想编写一个使用数百个类和模块的大型程序。但我担心如果我这样做,我会让应用程序陷入困境,因为我不了解Python如何处理内存管理。
我知道这是一个模糊的问题,但如果有人将我联系起来或指向正确的方向,我们将不胜感激。
答案 0 :(得分:22)
Python - 比如C#,Java,Perl,Ruby,Lua和许多其他语言 - 使用垃圾收集而不是手动内存管理。您可以定期自由创建对象和语言的内存管理器(或者当您专门指向它时)查找程序不再引用的任何对象。
因此,如果您想要保留一个对象,只需保留对它的引用即可。如果您希望释放对象(最终)删除对它的任何引用。
def foo(names):
for name in names:
print name
foo(["Eric", "Ernie", "Bert"])
foo(["Guthtrie", "Eddie", "Al"])
对foo
的每次调用都会创建一个用三个值初始化的Python list
对象。对于foo
调用的持续时间,它们由变量names
引用,但是一旦该函数退出,没有变量持有对它们的引用,并且它们是垃圾收集器要删除的公平游戏。
答案 1 :(得分:7)
阅读以下有关Python内存管理的文章:
Exerpt :(例子可在文章中找到):
Python中的内存管理涉及包含所有内容的私有堆 Python对象和数据结构。这个私人的管理 Python内存管理器在内部确保堆。 Python 内存管理器有不同的组件处理各种 动态存储管理方面,如共享,细分, 预分配或缓存。
在最低级别,原始内存分配器确保存在 私有堆中有足够的空间来存储所有与Python相关的数据 与操作系统的内存管理器交互。在之上 原始内存分配器,几个特定于对象的分配器操作 在同一个堆上并实现不同的内存管理策略 适应每种物体类型的特殊性。例如, 整数对象在堆内的管理方式与字符串不同, 元组或字典,因为整数意味着不同的存储 要求和速度/空间权衡。因此,Python内存管理器 将一些工作委托给特定于对象的分配器,但是 确保后者在私有堆的范围内运行。
了解Python堆的管理非常重要 由解释器本身执行,并且用户没有 控制它,即使她经常操纵对象指针 该堆内的内存块。堆空间的分配 Python对象和其他内部缓冲区是按需执行的 Python内存管理器通过列出的Python / C API函数 这份文件。
答案 2 :(得分:3)
x =10
print (type(x))
内存管理器(MM): x指向10
y = x
if(id(x) == id(y)):
print('x and y refer to the same object')
(MM): y指向同一个10对象
x=x+1
if(id(x) != id(y)):
print('x and y refer to different objects')
(MM): x指向另一个对象是11,先前指向的对象被销毁
z=10
if(id(y) == id(z)):
print('y and z refer to same object')
else:
print('y and z refer different objects')
答案 3 :(得分:2)
我的5美分:
最重要的是,python只为引用的对象释放内存(不适用于类,因为它们只是容器或自定义数据类型)。同样,在python中,一切都是对象,因此int,float,string,[],{}和()都是对象。这意味着如果你的程序不再引用它们,它们就是垃圾收集的受害者。
虽然python使用'引用计数'和'GC'来释放内存(对于未使用的对象),但是这个空闲内存不会返回给操作系统(在windows中它的情况不同) 。这意味着空闲内存块只返回python解释器而不是操作系统。所以你的python进程最终将拥有相同的内存。但是,python将使用此内存分配给其他一些对象。
在http://deeplearning.net/software/theano/tutorial/python-memory-management.html
给出了非常好的解释答案 4 :(得分:1)
是的,它在python3中也有相同的行为