Mathematica中的临时变量

时间:2010-11-06 17:09:45

标签: python oop wolfram-mathematica

我为Mathematica编写了一个名为MathOO的软件包。简而言之,它允许您在Mathematica中使用面向对象,就像在Python中一样。有关详细信息,请阅读Voofie/MathOO中的以下文章:

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

我遇到的问题是,我想拥有垃圾收集器,因此用户在使用它之后不必显式删除该对象。例如:

NewClass[Object1]
Object1.$init$[self_]:= Return[];

在上面两行中,我只是将Object1定义为一个新类,并将构造函数定义为一个空函数。如果您熟悉Python,则应该看到与__init__()的相似性。

要实例化Object1,我这样做:

object1 = new[Object1][]

输出结果为:

Out: object$13

这里,对象$ 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的manual,它说:

  

如果不再引用临时符号,则删除它们:

那么,这是Mathematica的错误吗?或者有任何解决方法吗?我正在使用Mathematica 7.0。非常感谢你。

2 个答案:

答案 0 :(得分:2)

当Mathematica没有更多引用时,他们确实会收集Temporary个变量。也就是说,有两个原因使你的x $ 117不是垃圾收集。

  1. 请记住Module使用词法作用域,因此模块变量只是“本地”,因为它们给出了一个唯一的名称“var $ modnum”和Temporary {{ 1}}。 由于您向Attribute提供了x,因此必须先将其清除,然后才能对DownValue进行垃圾回收。

  2. 您的x已设置为临时变量y,输出已分配给x$...。因此,您还需要清除历史记录:Out[]

  3. 然后,您的Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];示例似乎已正确收集垃圾。


    使用你的MathOO软件包(我昨天下载但尚未玩过)时,你可以将Module设置为某个有限数字。并建议用户禁止实例化的输出$HistoryLength

答案 1 :(得分:1)

Mathematica是一个字符串重写系统(在底部)(有点)(不是真的)(但是真的)(ANYWAY ...)DownValue“x $ 117 [1] = 2”是一个字符串重写规则,它想象是关联数组中的条目并不完全不准确。该数组名为“x $ 117”,条目为{1,2}对。只要数组中有一个条目,就会引用符号“x $ 117”并且不会被Mma GC。

最好的办法是在符号被破坏或超出范围时删除[]符号。 (Clear []是不够的,因为Clear []不会消除与符号相关的延迟属性,消息或默认值,因此Mma仍会保留对符号的实时引用。)