在python中清除变量


Answers:


157

这有什么错self.left = None


19
不熟悉None关键字。这与其他语言中的null相似吗?
Bnicholas 2011年

6
是; 它等效于null。
Smashery 2011年

12
@Bnicholas但是,与null在PHP中不同的是null,在大多数情况下,在PHP中将变量设置为会给您类似的行为,就像您一开始没有定义它一样。NonePython中的值与未定义的变量完全不同。None与的其他大部分版本非常相似null(至少直到我们深入了解更多神秘的细节为止)。

这不是关键字;这是内置对象的默认设置名称。您可以做任何事情None,也可以使用其他任何未指定类型的“普通”对象做任何事情:将其存储在容器中,打印它的字符串表示形式,检查其中的一些元数据...无论如何,您是否尝试过Google的“ python null”当量”?我是认真的; 需要进行一些分析,但是信息就在那里。
Karl Knechtel

18
打开python终端并输入print x,然后按Enter。像大多数语言一样,当您尝试打印未定义的变量时,这将产生解释器错误。但是,如果您定义了变量,然后尝试使用None将其清除,则使用print x代码将产生该单词None作为输出。我是python的新手,所以我可能会误会,但这似乎不像是已清除变量的行为。
Musixauce3000

407

del关键字会做。

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

但在这种情况下,我投赞成票 self.left = None


18
有时这并不能完全删除它,而只是删除了对内存中的引用。这会在不获取gc的内存中留下虚变量。
雅各布·鲍耶

4
del还有一个缺点是,如果您尝试删除不存在的变量,则会引发异常,这通常是不可取的。
菲利普·基恩斯

33
我只想指出,如果您不小心声明了一个变量,该变量会覆盖内置命令,例如,type=… 当您打算键入type(…)然后删除时,这是找回原始功能的最简单方法。也就是说,如果将其保留为None,则仍将切断对基础功能的访问。
mpacer

1
垃圾收集/收集/收集
mccc 2016年

1
这是我一直在寻找的那个。在cmd行播放时,我已经... set = set(myList)然后意识到我不能再将set用作函数(doh)。使用del set允许我再次将其用作FX。当然,我永远不会在实际脚本中使用该保留的var。
jbchurchill

111

var = None “清除值”,将变量的值设置为“ null”,就像“ None”的值一样,但是指向变量的指针仍然保留。

del var 完全删除变量的定义。

如果您以后想使用该变量,例如为其设置一个新值,即保留该变量,None会更好。


如果我想完全删除在某些情况下不存在的变量该怎么办。是否有任何参数可以避免错误?我需要删除几个变量:del a,b,c,d我可以使用loop和try / except,但是我更喜欢使用一些开关来避免它。
Tedo Vrbanec

63

实际上,这不会删除变量/属性。它所要做的只是将其值设置为None,因此该变量仍会占用内存空间。如果要从内存中完全清除变量的所有存在,可以键入:

del self.left

8
我不明白为什么= None答案如此受欢迎。这是正确的答案
Nikolay Gromov,2015年

1
OP clear说不remove。del将杀死该属性和查找。将其设置为None是一种更清洁的方法,它比您可以检查的if self.left要好,这足以检查节点是否为空。
user1767754

“将其设置为None更加干净”-值得考虑的是,如果有人(您自己一段时间后或协作者)正在阅读代码del,恕我直言,那么很明显,在“心理分析”时可以忘记该变量。 ' 代码。
Pocketsand,

1
@NikolayGromov在您的日常代码中,当您想获取self.left的值时,您希望检查if self.left:还是希望处理一个可能的NameError异常,如果您未在任何地方处理该错误,它将导致程序崩溃?
Pierre.Sassoulas

33
  • 如果要完全删除它,请使用del

    del your_variable

  • 否则,要使值None

    your_variable = None

  • 如果它是可迭代的(例如列表或元组),则可以将其设为空,例如:

    your_variable.clear()

然后your_variable将是空的


对于第二个选项,“清除其内容”是不正确的,这只会将变量重新分配为None,原始对象仍将保留(除非其引用计数减少为零,否则将被垃圾回收)。
cs95

0

是否要删除变量,不是吗?

好的,我想我有一个@bnul答案的最佳替代主意:

您可以使用以下方法删除个人名称del

del x 或者您可以将它们从globals()对象中删除:

for name in dir(): if not name.startswith('_'): del globals()[name]

这只是一个示例循环;它仅在防御性上删除不以下划线开头的名称,并假设(不是毫无道理的)假设您在解释器的开头仅使用了没有下划线的名称。如果您确实想透彻一点,则可以使用硬编码的名称列表来保留(白名单)。除了退出并重新启动解释器外,没有内置函数可以为您执行清除操作。

您导入的模块(import os)将保持导入状态,因为它们被sys.modules引用。后续导入将重用已经导入的模块对象。您只是在当前的全局名称空间中没有对它们的引用。

请重新考虑这个答案!


-1

我使用了上面提到的一些选项:

del self.left

或使用以下方式将值设置为“无”

self.left = None

当您将值设置为None时,了解差异并放置一些异常处理程序很重要。如果您要使用模板打印条件语句的值,请说,

print("The value of the variable is {}".format(self.left))

您可能会看到变量的值显示为“变量的值为None”。因此,您必须在其中放置一些异常处理程序:

if self.left:
    #Then only print stuff

如果self.left不是 None

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.