2011-12-14 27 views
13

In Mathematica, la documentazione per ClearAll stati:Differenza tra Chiara e rimuovere in Mathematica

ClearAll[symb1, symb2, ...]
di cancellare i valori, le definizioni, gli attributi, i messaggi e le impostazioni predefinite con simboli.

supporta anche un formato simile in cui può cancellare qualsiasi valore/definizioni che corrispondono a un modello di stringa di input:

ClearAll["form1", "form2", ...] 

Ma c'è anche la funzione Remove, per il quale la documentazione dice:

Remove[symbol1, ...]
rimuove i simboli completamente, in modo che i loro nomi non vengano più riconosciuti da Mathematica.

Supporta anche lo stesso input di stringa basato su schema supportato da ClearAll.

Per me, sembra che entrambe le funzioni realizzino la stessa identica cosa. C'è qualche differenza pratica nell'usare l'una o l'altra?

So che se attribuisco un attributo a un simbolo, Clear non lo rimuoverò ma lo sarà ClearAll e Remove. Ma sembra che Remove e ClearAll stiano facendo la stessa cosa.

+0

Questo thread recente di Mathgroup sembra pertinente: https://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/3db59462237f509f. Guarda in particolare il terzo post di Oleksandr Rasputinov in quel thread (è 15-esimo dall'inizio del thread) - dà alcuni buoni motivi per quando potrebbe essere necessario 'Remove' e cosa lo rende speciale. –

risposta

13

ClearAll lascia il simbolo nella tabella dei simboli:

In[1]:= x=7; 

In[2]:= ?x 
Global`x 

x = 7 

In[3]:= ClearAll[x] 

In[4]:= ?x 
Global`x 

Remove rimuove dalla tabella dei simboli:

In[5]:= Remove[x] 

In[6]:= ?x 

Information::notfound: Symbol x not found. 

Una ragione per usare Remove invece di ClearAll è se un simbolo nasconde un altro simbolo più in basso il tuo $ ContextPath. Ecco un esempio inventato:

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 

Un altro motivo per utilizzare Remove è che l'interfaccia notebook include solo i simboli noti quando si sceglie Modifica> selezione completa (o su un Mac, premere Comando-K).

+1

Interessante. Esistono casi realistici in cui potresti dover rimuovere qualcosa dalla tabella dei simboli? –

+0

Ho modificato la mia risposta. –

+4

Un caso comune si verifica se si dimentica di caricare un pacchetto prima di utilizzare una funzione contenuta - ad esempio, per valutare 'JavaClassPath []' prima di chiamare '' Needs ["JLink'"] ''. Se in seguito viene richiesto il necessario 'Need', si finisce con' 'JLink'JavaClassPath'' che ombreggia' 'Global'JavaClassPath'', con il front-end che mostra entrambi i simboli in rosso. '' Rimuovi [Global'JavaClassPath] '' corregge la situazione. – WReach