Ну, давайте попробуем наивно:
Составить список:
In[1]:= ClearAll[list, a, b, c];
list = {a, b, c};
Это так, как мы ожидаем:
In[3]:= list
Out[3]= {a, b, c}
Установить для первого элемента значение 2:
In[4]:= list[[1]] = 2
Out[4]= 2
In[5]:= list
Out[5]= {2, b, c}
Это не влияет на:
In[6]:= a
Out[6]= a
Начать снова:
In[7]:= ClearAll[list, a, b, c];
list = {a, b, c};
In[9]:= list
Out[9]= {a, b, c}
Проблема в том, что Set (=) имеет HoldFirst
как один из его атрибутов, т. е. он не оценивает свой первый аргумент, который является левой стороной, и назначение относится к списку, а не к переменной, которая находится в этом месте.Но вы можете форсировать оценку, используя Evaluate
:
In[10]:= Evaluate[list[[1]]] = 2
Out[10]= 2
Теперь список выглядит так же, как и раньше:
In[11]:= list
Out[11]= {2, b, c}
, но это только потому, что a все еще там и получилзначение 2 (в предыдущей версии a было заменено на 2):
In[12]:= a
Out[12]= 2
Если вы теперь установите значение 3, вы увидите, что этот список изменений тоже:
In[13]:= a = 3
Out[13]= 3
In[14]:= list
Out[14]= {3, b, c}
РЕДАКТИРОВАТЬ
Возможно, более близко к формулировке вашего вопроса, вы можете Map
Set
по списку:
In[16]:= ClearAll[list, a, b, c];
list = {a, b, c};
In[18]:= Set[#, RandomInteger[10]] & /@ list
Out[18]= {4, 8, 1}
In[19]:= list
Out[19]= {4, 8, 1}
In[21]:= {a, b, c}
Out[21]= {4, 8, 1}