如何在 Julia 中清除或删除全局变量?

39

是否有类似于MATLAB中的“clear”的语法,即如果我有一个全局变量“a”,如何摆脱它?如何执行相应的操作?

clear a
6个回答

14

查看此问题的最新答案,请转至此链接:https://docs.julialang.org/en/v1/manual/faq/#How-do-I-delete-an-object-in-memory%3F

从文档中获得:

Julia 没有像 MATLAB 的 clear 函数那样的类比;一旦在 Julia 会话(技术上是在模块 Main 中)中定义了名称,它就一直存在。

如果内存使用是您关心的问题,您可以始终将对象替换为消耗更少内存的对象。例如,如果 A 是一个占用几个 GB 的数组,而您不再需要它,您可以使用 A = 0 释放内存。内存将在下一次垃圾回收运行时被释放;您可以使用 gc() 强制执行垃圾回收。


1
以上链接已失效。 - Salvatore Cosentino

12

Julia 0.6 < 1.0

在 Julia 0.6 中,您可以通过调用 clear!() 来删除变量并释放其内存。

您必须在变量的符号名称上调用 clear!:

julia> x = 5
5

julia> sizeof(x)
8

julia> clear!(:x)

julia> sizeof(x)
0

正如DFN所指出的那样,这实际上不会删除对象,而是将它们设置为nothing。这对于释放工作区内的内存非常有用,因为您可以“删除”非常量对象的内存占用。


Julia 1.0+

在Julia 1.0+中无法使用此方法。如果您正在使用1.0+版本,则必须将对象设置为Nothing,然后让垃圾收集器处理。 这来自官方文档,点击此处查看。


8
很有趣,但不幸的是它并没有完全被清除。该值只是被设置为 nothing。例如,您不能执行 julia> const x = 3,因为那样会得到 ERROR: cannot declare x constant; it already has a value 的错误。 - DNF
好的。我还是觉得从非常量对象中释放一些内存很有用。 - niczky12
这是绝对有用的,我想这是最接近官方解决方案的东西。只是它有这个弱点。而且这对我来说是新的 :) - DNF
我在 Julia 1.4.2 中遇到了 ERROR: UndefVarError: clear! not defined 的错误。 - Dima Lituiev
你将它设为类型 Nothing 而不是单例实例 nothing,这很有趣,你这么做有什么特别的原因吗? - Jonas Eschmann

10
截至0.3.9版本,可以通过workspace()函数清除所有全局变量(获取新工作区)。
还可以通过使用LastMain(例如LastMain.foobar)从上一个工作区获取变量。
因此,目前唯一的实现方法是清除所有内容,并将除所需变量外的所有内容转移到新工作区。

9

在Atom/Juno REPL中使用exit()有什么问题吗?谢谢。 - PatrickT

8

针对 Julia-0.6.4 版本,

clear!(:x)

如@niczky所说,它正在工作,并且在iJulia中运行。

但是,对于Julia-1.0.0版本,

clear!(:x)

... 抛出以下异常:

ERROR: UndefVarError: clear! not defined
Stacktrace:
 [1] top-level scope at none:0

所以,它在Julia-1.0.0中出现故障。


1
绝对的清晰!(:x)在notebook(IJulia)中无法使用julia 0.6.0!您可以选择使用x = 0作为替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接