Mathematica中Clear和Remove之间的区别

Mik*_*ley 13 wolfram-mathematica

在Mathematica中,ClearAll的文档指出:

ClearAll[symb1, symb2, ...]
使用符号清除值,定义,属性,消息和默认值.

它还支持类似的格式,它可以清除与输入字符串模式匹配的任何值/定义:

ClearAll["form1", "form2", ...]
Run Code Online (Sandbox Code Playgroud)

但是还有函数Remove,文档说:

Remove[symbol1, ...]
完全删除符号,以便Mathematica不再识别它们的名称.

它还支持相同的基于模式的字符串输入ClearAll.

对我来说,似乎两个功能完全相同.使用其中一个有什么实际区别吗?

我知道,如果我举一个属性的象征,Clear不会删除,但ClearAllRemove意志.但似乎Remove并且ClearAll正在做同样的事情.

rob*_*off 13

ClearAll 将符号留在符号表中:

In[1]:= x=7;

In[2]:= ?x
Global`x

x = 7

In[3]:= ClearAll[x]

In[4]:= ?x
Global`x
Run Code Online (Sandbox Code Playgroud)

Remove 将其从符号表中删除:

In[5]:= Remove[x]

In[6]:= ?x

Information::notfound: Symbol x not found.
Run Code Online (Sandbox Code Playgroud)

使用的一个原因Remove,而不是ClearAll是,如果一个符号还隐藏着另一个符号下你的$ contextPath中.这是一个人为的例子:

In[1]:= $ContextPath = { "Global`", "System`" };

In[2]:= Global`Sin[x_] := "hello" 

Sin::shdw: Symbol Sin appears in multiple contexts {Global`, System`}
    ; definitions in context Global`
     may shadow or be shadowed by other definitions.

In[3]:= Sin[1.0]

Out[3]= hello

In[4]:= ClearAll[Sin]

In[5]:= Sin[1.0]

Out[5]= Sin[1.]

In[6]:= Remove[Sin]

In[7]:= Sin[1.0]

Out[7]= 0.841471
Run Code Online (Sandbox Code Playgroud)

使用的另一个原因Remove是当您选择"编辑">"完成选择"(或在Mac上,按Command-K)时,笔记本界面仅包含已知符号.

  • 如果在使用包含函数之前忘记加载包,则会出现一种常见情况 - 例如在调用``Needs ["JLink`"]``之前评估`JavaClassPath []`.如果之后调用了必需的`Needs`,你最终会得到``JLink`JavaClassPath``影响``Global`JavaClassPath``,前端显示两个符号为红色.``删除[Global`JavaClassPath]``修复了这种情况. (4认同)
  • @Szabolcs实际上`Removed`不是一个普通的头,而是一个打印形式.一旦我们"删除"`y`,我们就会以微妙但永久的方式使`x`无效 - 将`y`重新引入会话将无济于事."删除"实际上是一种特殊用途的析构操作,旨在更多地删除自动生成的符号.在一个相互连接的功能系统中(可能来自不同的包),因此只有在没有任何东西取决于被删除的符号时,"删除"才是安全的.解决阴影是我所知道的"删除"的唯一主流(频繁,非高级)应用. (2认同)