Mathematica 中的临时变量

发布于 2024-10-01 03:01:49 字数 1529 浏览 2 评论 0原文

我为 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:

MathOO: Adding Python style Object Orientation to Mathematica with MathOO (1.0 beta launch) [Alternative to Objectica]

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

永不分离 2024-10-08 03:01:49

当临时变量没有更多引用时,Mathematica 确实会进行垃圾收集。也就是说,您的 x$117 没有被垃圾回收有两个原因。

  1. 请记住,Module 使用词法作用域,因此模块变量只是“本地”,因为它们被赋予唯一的名称“var$modnum”和临时 属性
    由于您为 x 提供了 DownValue,因此必须先将其清除,然后才能对 x 进行垃圾收集。

  2. 您的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.

  1. 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 the Temporary Attribute.
    Since you gave your x a DownValue, it must be cleared before x can be garbage collected.

  2. Your y was set to be the temporary variable x$... and the output was assigned to Out[]. 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 instantiations object1 = new[Object1][];

缘字诀 2024-10-08 03:01:49

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.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文