как исправить это назначение списка в Mathematica - PullRequest
3 голосов
/ 11 января 2011

Я хочу сделать следующее в Mathematica

Table[p[i], {i, -3, 0}] = Flatten[{Table[0, {i, -3, -1}], 1}]

Но я получил ошибку:

Set::write: Tag Table in Table[p[i], {i, -3, 0}] is Protected.

Тем не менее, это прекрасно:

{p[-3], p[-2], p[-1], p[0]} = Flatten[{Table[0, {i, -3, -1}], 1}]

Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 11 января 2011

Принудительное вычисление LHS на части, которые могут быть назначены:

Оценка [Таблица [p [i], {i, -3, 0}]] = Свернуть [{Таблица [0, {i, -3, -1}], 1}]

4 голосов
/ 11 января 2011

Причина, по которой это не работает, заключается в том, что Set имеет атрибут HoldFirst. Это означает, что Set[a,stuff] передает значение a вместо значения a функции Set. Относительно того, почему он имеет этот атрибут, спросите себя: когда вы делаете Set[a,stuff], хотите ли вы присвоить stuff символу a или значению a?

В вашем примере a содержит таблицу имен переменных, поэтому вы хотите, чтобы значение a и HoldFirst раздражало. Однако большую часть времени a будет иметь значение, подобное 5, и вы хотите, чтобы a=stuff присваивал stuff символу a, а не значению 5

Обычный способ обойти атрибуты удержания следующий:

Set@@{Table[p[i], {i, -3, 0}],Flatten[{Table[0, {i, -3, -1}], 1}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...