如何利用python从内存中删除变量和对象

928 阅读5分钟

问题的提出和解决方案概述

这篇文章将告诉你如何使用和从内存中删除变量和对象。 [del](https://blog.finxter.com/python-cheat-sheet/)[None](https://blog.finxter.com/python-cheat-sheet/) 关键字从内存中删除变量和对象。

Python语言有几个内置的保留字,具有特定的含义,称为关键字。这些关键字 是为Python保留的,不能在其他地方使用。例如,声明一个变量、一个列表、一个对象,等等。

要显示Python关键字的列表,请运行以下脚本。

import keyword
print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

本文重点介绍使用 delNone关键字。


💬 问题 :我们如何编写代码来删除或清除内存中的对象?

我们可以通过下面的一个方案来完成这个任务。

  • 方法1 :用以下方法删除变量 [del](https://blog.finxter.com/python-cheat-sheet/)`[None](https://blog.finxter.com/python-cheat-sheet/)`从内存中删除变量
  • 方法2 :用以下方法删除列表或字典 [del](https://blog.finxter.com/python-cheat-sheet/)`[None](https://blog.finxter.com/python-cheat-sheet/)`从内存中删除
  • 方法3 :删除一个函数,使用 [del](https://blog.finxter.com/python-cheat-sheet/)`[None](https://blog.finxter.com/python-cheat-sheet/)`从内存中删除一个函数
  • 方法4:用和删除用户定义的对象 dir()globals()
  • 方法5:使用gc

方法1:使用del和None删除一个变量

这个例子使用了 del[None](https://blog.finxter.com/python-cheat-sheet/)关键字来删除和清除一个变量,并比较其差异。

puzzles_solved = 12975
print(puzzles_solved)

上面,我们声明了变量puzzles_solved ,设置值为12975,并将其输出到终端。

12975

然而,如果puzzles_solved 的值被设置为 `[None](https://blog.finxter.com/python-cheat-sheet/)`,这并不是从内存中删除该变量。相反,它清除了这个值。

puzzles_solved = None
print(puzzles_solved)

通过向终端发送puzzles_solved 的内容来确认。

必须使用 [`del`](https://blog.finxter.com/python-cheat-sheet/)关键字必须被用来从内存中完全删除一个变量。

puzzles_solved = 12975
del puzzles_solved
print(puzzles_solved)

将输出发送到终端会显示一个NameError 的信息。该变量已不存在!

NameError: name 'puzzles_solved' is not defined

方法2:删除一个列表或一个字典

这个例子使用delNone关键字来删除一个 List和一个字典,并比较了两者的区别。

user_list = [212, 215, 387, 598, 610]
user_dict = {212: 'Tom', 215: 'Amy', 387: 'Rob', 598: 'Carl', 610: 'Raj'}

print(user_list)
print(user_dict)

上面,创建一个包含虚构的Finxter用户ID的列表 user_list 。这将保存到user_list 。接下来,创建一个包含虚构的Finxter数据(ID和名字)的字典。这将保存到user_dict

💡注意:这个例子显示了对一个List和一个Dictionary的删除。然而,任何对象都可以使用 del关键字删除任何对象。

两者都被输出到终端。

[212, 215, 387, 598, 610]
{212: 'Tom', 215: 'Amy', 387: 'Rob', 598: 'Carl', 610: 'Raj'}

但是,如果这些变量被设置为 [`None`](https://blog.finxter.com/python-cheat-sheet/),这就不会从内存中删除这些变量。相反,它清除了这些值。

user_list = None
user_dict = None

print(user_list)
print(user_dict)

以下是输出到终端的确认结果。

None
None

必须使用 [del](https://blog.finxter.com/python-cheat-sheet/)关键字必须用于从内存中完全删除一个变量。

del user_list
del user_dict

print(user_list)
print(user_dict)

将输出发送到终端会显示一个NameError 信息。该变量已不存在!

NameError: name 'user_list' is not defined

💡注意:第二个 [print()](https://blog.finxter.com/python-print/)语句并不执行,因为一旦脚本收到错误,执行就会终止。

YouTube Video


方法3:从内存中删除函数

这个例子使用 del关键字来从内存中删除一个现有的函数。

def  add_me(a, b):
    return a+b
print(add_me(2,3))

del add_me
print(add_me(2,3))

上面定义了函数add_me ,将两(2)个数字相加并返回结果。该结果被输出到终端。

5

然后,这个函数被删除,使用 del关键字来删除这个函数。将输出发送到终端,会显示一个NameError 的信息。该函数已不存在!

NameError: name 'add_me' is not defined

方法4:用dir()和globals()删除用户定义的对象

这个例子删除了用户定义的对象,用 dir()globals()函数。

def add_me(a, b):
    return a+b

def subtract_me(a, b):
    return a-b

print(dir())

上面声明了两(2)个函数,add_me()subtract_me() 。两者都返回一个计算结果。

运行这段代码后,这些函数应该存在于内存中。的结果被发送到终端以确认。 dir()的结果被发送到终端以确认这一点。

'__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add_me', 'subtract_me']

如果不带参数,Python 内置的dir() 函数会返回在本地范围内定义的函数和变量名,也就是你当前模块的名字空间。

如果使用一个对象参数dir(object) 返回定义在该对象范围内的属性和方法名称的列表。因此,dir() 返回给定范围内的所有名称。

for el in dir():
    if el[0:2] != "__":
        del globals()[el]

下面的 [for](https://blog.finxter.com/python-loops/) 循环遍历结果中的每个元素。 dir()结果。 如果前两(2)个字符以'__' 开始,该元素将被忽略。

如果不是这种情况,这段代码将删除元素(el)。 globals()函数来删除元素(del globals()[el])。

的结果将被发送到终端,以确认 dir()的结果被发送到终端以确认删除。

'__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'el']

💡注意:先前创建的两(2)个函数被删除了。然而,变量el 现在驻留在内存中。


方法5:使用gc库

这个例子导入了 [gc](https://docs.python.org/3/library/gc.html)库。这个库,也被称为代际垃圾收集器,记录了内存中的所有对象。

如果该 [](https://blog.finxter.com/how-to-check-gc-package-version-in-python/)`[gc](https://docs.python.org/3/library/gc.html)`库没有安装在计算机上,请点击这里获取说明。

import gc

user_list = [212, 215, 387, 598, 610]

del user_list
gc.collect()
print(dir())

del gc
print(dir())

上面,导入了 [gc](https://blog.finxter.com/how-to-check-gc-package-version-in-python/)库。

然后声明一个虚构的Finxter用户列表,并保存到user_list 。下面一行将其删除。

然后,调用 gc.collect()函数被调用,并将结果输出到终端。

'__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'gc']

注意,gc 类显示。

下面一行删除了这个类。输出被发送到终端。

'__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

总结

这(5)种从内存中删除变量和对象的方法应该给你足够的信息来选择适合你编码要求的最佳方法。

祝您好运,编码愉快!