Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数在被调用后是否仍然可以使用内存?_Python_Python 3.x_Memory_Memory Management_Memory Leaks - Fatal编程技术网

Python函数在被调用后是否仍然可以使用内存?

Python函数在被调用后是否仍然可以使用内存?,python,python-3.x,memory,memory-management,memory-leaks,Python,Python 3.x,Memory,Memory Management,Memory Leaks,如果我在Python 3中运行一个函数(func()),那么在func()中创建但在完成后无法访问的对象是否可能会导致其内存使用率增加 例如,你会跑步吗 def func(): # Objects being created, that are not able to be used after function call has ended. while True: func() 是否曾经导致程序内存不足,无论func()中的内容是什么 如果程序持续使用内存,那么在func

如果我在Python 3中运行一个函数(
func()
),那么在
func()
中创建但在完成后无法访问的对象是否可能会导致其内存使用率增加

例如,你会跑步吗

def func():
    # Objects being created, that are not able to be used after function call has ended.

while True:
    func()
是否曾经导致程序内存不足,无论
func()
中的内容是什么

如果程序持续使用内存,那么在
func()
中可能会发生哪些情况,从而导致程序在被调用后继续使用内存

编辑:
我只是想创建在函数结束后不能再访问的对象,因此应该删除它们。

是的,Python函数在被删除后仍可能使用内存 打电话来

  • Python使用垃圾收集(GC)进行内存管理。大多数GCs(我想是吧 (可能有一些例外情况)不保证他们是否或何时会获得自由 未引用对象的内存。假设你有一个函数
    消耗大量内存()
    并将其称为:

    while True:
        consume_lots_of_memory()
    
    无法保证在第一次调用中分配的所有内存 要
    消耗\u大量的\u内存()
    将在调用前释放 第二次。理想情况下,GC将在调用完成后运行,但是 可能在第五次通话的中途。所以取决于GC 运行时,您可能会消耗比预期更多的内存 甚至可能内存不足

  • 您的函数可能会修改全局状态,并使用大量 永远不会被释放的记忆。假设您有一个模块级缓存和一个 函数
    缓存大量对象()
    称为:

    module_cache = {}
    while True:
        cache_lots_of_objects()
    
    每次调用
    cache\u lots\u of\u objects()
    都只会添加到缓存中,并且 缓存只会不断消耗更多内存。即使总承包商及时 释放在
    缓存\u lots\u of \u objects()
    中创建的非缓存对象,您的 缓存最终可能会消耗您所有的内存

  • 您可能会遇到Python本身的实际内存泄漏(不太可能) 但也有可能),或者从第三方库中使用C API,使用 泄漏的C库,或与C库接口不正确

  • 关于内存使用的最后一个注意事项。仅仅因为Python释放了 对象,这并不一定意味着内存将从进程中释放 并返回到操作系统。原因与记忆如何有关 以块(页)的形式分配给进程。见阿巴内特的 到 比我能提供的更好的解释


简短的回答是肯定的-
非本地列表。附加(1)
将是一个简单的例子。您能解释一下为什么需要这种行为吗?也许这个网站超出了范围…另一个简单的例子:
def():“”;f、 在这种情况下,您需要向我们展示一个展示这种行为的。我们无法调试无法运行甚至无法查看的代码。是的,我很感激,我正在创建一个,但我只是想先检查是否有问题(我不是疯了!),谢谢!这真的很有用。特别是第一点和最后一点。我说的对吗?我可以使用
GC.collect()
,强制GC进行收集?@Gloin是的,这是正确的。我自己曾经在生成大型导出时使用过这一点。