Mathematica 中的临时变量
我为 Mathematica 编写了一个名为 MathOO 的包。简而言之,它允许您在 Mathematica 中使用面向对象,就像在 Python 中一样。详情请阅读 Voofie/MathOO 中的文章:
MathOO:添加 Python 样式对象方向使用 MathOO 到 Mathematica(1.0 beta 发布)[Objectica 的替代品]
我遇到的问题是,我希望有垃圾收集器,以便用户在使用对象后不必显式删除该对象。例如:
NewClass[Object1]
Object1.$init$[self_]:= Return[];
在上面两行中,我只是将 Object1 定义为一个新类,并将构造函数定义为一个空函数。如果您熟悉 Python,您应该会看到与 __init__()
的相似之处。
为了实例化一个 Object1,我这样做:
object1 = new[Object1][]
输出是:
Out: object$13
这里,object$13 是一个临时变量。我想要的是,当没有对该临时变量的引用时,它应该被自动删除。但它并没有按预期工作。我发现问题如下:
In: y = Module[{x}, x[1] = 2; x]
Out: x$117
In: FullDefinition[y]
Out: y = x$117
Attributes[x$117] = {Temporary}
x$117[1] = 2
由于 y 持有 x$117 的引用,因此 x$117 尚未删除。现在让我们通过将 y 的值设置为 1 来删除引用:
In: y = 1;
但是,x$117 仍然在这里:
In: Definition[x$117]
Out: Attributes[x$117] = {Temporary}
x$117[1] = 2
但我预计该变量会被删除,因为它不再被引用。从Mathematica的手册中,它说:
如果不再引用临时符号,则会将其删除:
那么,这是 Mathematica 的一个错误吗?或者有什么解决方法吗?我正在使用 Mathematica 7.0。非常感谢。
I have written a package for Mathematica called MathOO. In short, it allows you to use object orientation in Mathematica just like you do in Python. Please read the following article in Voofie/MathOO for details:
The problem I encountered is that, I would like to have garbage collector, so that user don't have to explicitly deleting the object after using it. For instance:
NewClass[Object1]
Object1.$init$[self_]:= Return[];
In the above two lines, I just defined Object1 to be a new class, and the constructor to be an empty function. If you are familiar with Python, you should see the similarity with __init__()
.
To instantiate an Object1, I do:
object1 = new[Object1][]
The output is:
Out: object$13
Here, object$13 is an temporary variable. What I want is, when there are no references to this temporary variable, it should be deleted automatically. But it doesn't work as expected. I have identified the problem to be the following:
In: y = Module[{x}, x[1] = 2; x]
Out: x$117
In: FullDefinition[y]
Out: y = x$117
Attributes[x$117] = {Temporary}
x$117[1] = 2
Since y holds a reference of x$117, so x$117 is not removed yet. Now let's delete the reference by setting the value of y to 1:
In: y = 1;
However, x$117 is still here:
In: Definition[x$117]
Out: Attributes[x$117] = {Temporary}
x$117[1] = 2
But I expected the variable to be removed since it is no longer referenced. From the manual of Mathematica, it said:
Temporary symbols are removed if they are no longer referenced:
So, is it a bug of Mathematica? Or is there any workaround methods? I am using Mathematica 7.0. Thank you very much.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
当临时变量没有更多引用时,Mathematica 确实会进行垃圾收集。也就是说,您的 x$117 没有被垃圾回收有两个原因。
请记住,
Module
使用词法作用域,因此模块变量只是“本地”,因为它们被赋予唯一的名称“var$modnum”和临时
属性
。由于您为
x
提供了DownValue
,因此必须先将其清除,然后才能对x
进行垃圾收集。您的
y
被设置为临时变量x$...
,并且输出被分配给Out[]
。所以还需要清除历史记录:Unprotect[In, Out];清除[输入,输出]; Protect[In, Out];
.那么您的
Module
示例似乎已被正确垃圾收集。当使用你的MathOO包(我昨天下载的,但还没有玩过)时,也许你可以将
$HistoryLength
设置为某个有限的数字。并建议用户抑制输出实例化object1 = new[Object1][];
Mathematica really does garbage collects
Temporary
variables when they have no more references. That said, there's two reasons that your x$117 is not garbage collected.Remember that
Module
uses lexical scoping, so the module variables are only "local" in the sense that they are give a unique name "var$modnum" and theTemporary
Attribute
.Since you gave your
x
aDownValue
, it must be cleared beforex
can be garbage collected.Your
y
was set to be the temporary variablex$...
and the output was assigned toOut[]
. So you also need to clear the history:Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];
.Then your
Module
example seems to be properly garbage collected.When using your MathOO package (that I downloaded yesterday, but haven't played with yet) maybe you can just set the
$HistoryLength
to some finite number.And recommend that users suppress the output of instantiationsobject1 = new[Object1][];
Mathematica 是一个字符串重写系统(在底部)(有点)(不是真的)(但真的)(无论如何......) DownValue "x$117[1] = 2" 是一个字符串重写规则,它并不完全是不准确地想象是关联数组中的一个条目。该数组名为“x$117”,条目为 {1,2} 对。只要数组中有一个条目,符号“x$117”就会被引用,并且不会被 Mma GC。
最好的选择是在符号被破坏或超出范围时删除[]符号。 (Clear[] 是不够的,因为与符号相关的延迟属性、消息或默认值不会被 Clear[] 消除,因此 Mma 仍将保留对符号的实时引用。)
Mathematica is a string rewriting system (at the bottom) (sort of) (not really) (but really) (ANYWAY...) The DownValue "x$117[1] = 2" is a string rewriting rule that it is not entirely inaccurate to imagine is an entry in an associative array. The array is named "x$117" and the entry is the pair {1,2}. As long as there is an entry in the array, the symbol "x$117" is referenced and will not be GCed by Mma.
Your best bet is to Remove[] symbols when they are destructed or go out of scope. (Clear[] is insufficient since lingering attributes, messages, or defaults associated with symbols are not eliminated by Clear[] and so Mma will still hold live references to the symbol.)