20

好的,我得到了一个类的概念,它允许其他类作为基础导入类,而如果使用它,则必须导入它。我将如何实施它?或者,Python 解释器是否已经以某种方式做到了这一点?它是否会从内存中销毁未使用的类,以及如何销毁?

我知道 C++/C 是非常面向内存的指针等等,但是 Python 是什么?我并不是说我有问题。我或多或少想为我的程序设计对其进行修改。我想编写一个使用数百个类和模块的大型程序。但是我担心如果我这样做,我会让应用程序陷入困境,因为我不了解 Python 如何处理内存管理。

我知道这是一个模糊的问题,但如果有人能将我链接或指向正确的方向,我将不胜感激。

4

5 回答 5

26

Python - 与 C#、Java、Perl、Ruby、Lua 和许多其他语言一样 - 使用垃圾收集而不是手动内存管理。您只需自由地创建对象,并且语言的内存管理器会定期(或当您专门指定它时)查找程序不再引用的任何对象。

因此,如果您想保留一个对象,只需保留对它的引用。如果您希望(最终)释放对象,请删除对它的任何引用。

def foo(names):
  for name in names:
    print name

foo(["Eric", "Ernie", "Bert"])
foo(["Guthtrie", "Eddie", "Al"])

这些调用中的每一个foo都会创建一个list用三个值初始化的 Python 对象。在foo调用期间,它们被变量引用names,但是一旦该函数退出,就没有变量持有对它们的引用,并且垃圾收集器删除它们是公平的游戏。

于 2012-07-21T22:40:57.367 回答
11
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')
  • Python内存管理分为两部分。
    1. 堆栈内存
    2. 堆内存
  • 方法和变量在堆栈内存中创建。
  • 对象和实例变量值在堆内存中创建。
  • 在堆栈内存中 - 每当创建方法和变量时都会创建堆栈帧。
  • 每当函数/方法返回时,这些堆栈帧就会自动销毁。
  • Python有垃圾收集器的机制,一旦变量和函数返回,垃圾收集器就会清除死对象。
于 2018-03-27T17:46:37.633 回答
7

阅读以下有关 Python 内存管理的文章:

Python:内存管理(更新到版本 3)

摘录:(示例可以在文章中找到):

Python 中的内存管理涉及一个包含所有 Python 对象和数据结构的私有堆。这个私有堆的管理由 Python 内存管理器在内部确保。Python 内存管理器具有处理各种动态存储管理方面的不同组件,例如共享、分段、预分配或缓存。

在最低级别,原始内存分配器通过与操作系统的内存管理器交互来确保私有堆中有足够的空间来存储所有与 Python 相关的数据。在原始内存分配器之上,几个特定于对象的分配器在同一个堆上运行,并实施适应每种对象类型特性的不同内存管理策略。例如,整数对象在堆内的管理方式与字符串、元组或字典不同,因为整数意味着不同的存储要求和速度/空间权衡。因此,Python 内存管理器将一些工作委托给特定于对象的分配器,但确保后者在私有堆的范围内运行。

重要的是要理解 Python 堆的管理是由解释器本身执行的,并且用户无法控制它,即使她经常操作指向堆内内存块的对象指针。Python 内存管理器通过本文档中列出的 Python/C API 函数按需执行 Python 对象和其他内部缓冲区的堆空间分配。

于 2012-07-21T22:38:44.550 回答
3

我的 5 美分:

  1. 最重要的是,python 只为引用的对象释放内存(不为类释放内存,因为它们只是容器或自定义数据类型)。同样,在 python 中一切都是对象,所以 int、float、string、[]、{} 和 () 都是对象。这意味着如果您的程序不再引用它们,它们就会成为垃圾收集的受害者。

  2. 尽管 python 使用“引用计数”和“GC”来释放内存(对于未使用的对象),但这些空闲内存不会返回给操作系统(尽管在 Windows 中是不同的情况)。这意味着空闲内存块只返回到 python 解释器而不是操作系统。所以最终你的 python 进程将拥有相同的内存。但是,python 将使用此内存分配给其他一些对象。

对此给出了很好的解释:http: //deeplearning.net/software/theano/tutorial/python-memory-management.html

于 2016-04-11T04:27:18.793 回答
2

是的,它在 python3 中的行为也是一样的

于 2017-11-21T04:15:29.057 回答