Hallo zusammen,
Set will immer einem Symbol etwas zuweisen (so haben wir das gelernt)
und wenn man Part[{a, b, c, d}, 1] = 1 Schreibt , wem sollte hieretwas
zugewiesen werden ?
Andreas will damit befehlen, dass a gleich 1 werde.
Schliesslich ist {a, b, c, d} ja ³nur² der Wert von pp , es ist nicht
identisch mit pp
Von pp ist in der Codezeile Part[{a, b, c, d}, 1] = 1 keine Rede. Also,
nocheinmal:
In[18]:= Clear[a, b, c, d]
{a, b, c, d}[[1]] = 1
During evaluation of In[18]:= Set::"setps" : {a, b, c, d} in the part
assignment is not a symbol. >>
Out[19]= 1
In[20]:= a
Out[20]= a
Keine Zuweisung an a. Warum nicht? Immerhin ist
In[21]:= Head[{a, b, c, d}[[1]]]
Out[21]= Symbol
In[23]:= FullForm[{a, b, c, d}[[1]]]
Out[23]//FullForm= a
aber
In[25]:= Attributes[Set]
Out[25]= {HoldFirst, Protected, SequenceHold}
Set[] hat Attribut HoldFirst. Daher
In[27]:= Evaluate[{a, b, c, d}[[1]]] = 1
Out[27]= 1
In[28]:= a
Out[28]= 1
Okay und hoffentlich auch Bingo. Das war eine Zuweisung an a. Weiter
schreiben Sie, Andreas,
Es ist zwar
In[30]:= pp == {a, b, c, d}
Out[30]= True
Aber: folgende Zuweisung funktioniert:
In[31]:= Part[pp, 1] = 1
Out[31]= 1
In[32]:= FreeQ[pp, a]
Out[32]= True
In[33]:= a
Out[33]= a
Das Part[pp, 1] = 1 ist - wie bereits gestern festgestellt - eine
Zuweisung an pp, nicht an a. pp soll an erster Stelle das Element 1
enthalten. Der Wert von a interessiert dabei nicht, a verschwindet einfach
aus der Liste:
Part[pp, 1] = 1 ist gleichbedeutend mit pp /. a -> 1
Es ist nicht möglich, hier einen Widerspruch zu konstruieren: Die
Zuweisung von Elementen an die Liste pp hat nichts mit der Wertzuweisung
an irgendein Element a (das sich auch in der Liste pp befinden kann) zu
tun. Mit anderen Worten, die Wirkung von Set[] hängt von den auftretenden
Operanden ab.
Wenn dem ersten Element einer Liste ein Wert zugewiesen werden soll, tritt
völlig konsistent der zuerst diskutierte Fall ein und man schreibt:
In[50]:= Clear[pp, a, b, c, d]
pp = {a, b, c, d}
Out[51]= {a, b, c, d}
In[52]:= Evaluate[Part[pp, 1]] = 1
Out[52]= 1
In[53]:= pp
Out[53]= {1, b, c, d}
In[54]:= a
Out[54]= 1
In[55]:= FreeQ[pp, a]
Out[55]= False
a ist immer noch in der Liste p und a hat den Wert 1.
Gruss
Udo.