什么时候python删除变量?

Don*_*beo 11 python memory garbage-collection

我知道python有一个自动垃圾收集器,因此它应该在没有更多引用时自动删除变量.

我的印象是局部变量(函数内部)不会发生这种情况.

def funz(z):
    x = f(z) # x is a np.array and contains a lot of data
    x0 = x[0]
    y = f(z + 1) # y is a np.array and contains a lot of data
    y0 = y[0]

    # is x and y still available here?
    return y0, x0
Run Code Online (Sandbox Code Playgroud)

del x是节省内存的正确方法吗?

def funz(z):
    x = f(z) # x is a np.array and contains a lot of data
    x0 = x[0]
    del x
    y = f(z + 1) # y is a np.array and contains a lot of data
    y0 = y[0]
    del y

    return y0, x0
Run Code Online (Sandbox Code Playgroud)

编辑:我编辑了我的例子,它更像我的真实问题.在我的实际问题中,x和y不是列表,而是包含不同长np.array的类

编辑:我能够运行代码:

x = f(z)
x0 = x[0]
print(x0)

y = f(z + 1)
y0 = [0]
print(y0)
Run Code Online (Sandbox Code Playgroud)

Fla*_*lau 12

实现使用引用计数来确定何时应删除变量.

在变量超出范围(如在您的示例中)之后,如果没有剩余的引用,则将释放内存.

def a():
    x = 5 # x is within scope while the function is being executed
    print x

a()
# x is now out of scope, has no references and can now be deleted
Run Code Online (Sandbox Code Playgroud)

除了列表中的字典键和元素之外,通常没有理由在Python中手动删除变量.

但是,正如在这个问题的答案中所说的那样,使用del可能有助于显示意图.

  • 一个重要的注意事项:垃圾收集和引用计数*不是*相同的东西,Python同时做到了.但是,垃圾收集主要用于清理循环引用,因此不是内存管理的主要形式.一旦引用计数降至零,引用计数就会释放内存,它不会等待GC循环.当然有一些例外,因为python会缓存整数和短字符串,即使由于性能原因没有对它们的实时引用也是如此. (2认同)

Ned*_*der 5

将两个概念分开是很重要的:名称和值。Python中的变量是引用值的名称。名称具有作用域:定义局部变量(通过为名称分配值)时,变量的作用域是当前函数。当函数返回时,变量消失。但这并不意味着价值就消失了。

值没有范围:它们会一直存在直到没有更多名称引用它们。您可以在函数中创建一个值,然后从该函数返回它,使该函数外部的名称引用该值,直到将来某个点不再引用该值时,该值才会被回收。

更多详细信息(包括图片!)在这里:有关Python名称和值的事实和神话