Wolfram mathematica 如何在mathematica中修复此列表赋值

Wolfram mathematica 如何在mathematica中修复此列表赋值,wolfram-mathematica,Wolfram Mathematica,我想在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}] 非常感谢 强制LHS评估为可

我想在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}]

非常感谢

强制LHS评估为可分配给以下人员的部件:


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

它不起作用的原因是
Set
具有属性
HoldFirst
。这意味着
Set[a,stuff]
将符号
a
而不是
a
的值传递给
Set
函数。至于它为什么有这个属性,问问你自己:当你设置[a,stuff]时,你想把
stuff
分配给symbol
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}]}

我这样做的时候收到了很多警告。有什么干净的方法可以做到这一点吗?谢谢@这个答案没有问题。我建议你在一个明确的[“全局”*“]或一个明确的Mma开始后尝试。@belisarius:对。我忘了清理。但似乎不是很优雅,或者至少不是我想要的方式(@Qiang也许你的问题应该更精确一点。这是一种有效的Mma方法来处理LHST中的表。这只在符号没有预先定义的情况下有效。在后一种情况下,以下方法也适用:SetAttributes[assignToSymbol,HoldRest];assignToSymbol[sym_Symbol,lhs_,rhs_]:=Set@@Append[Block[{sym},Hold][Evaluate[lhs]],Unevaluated[rhs]],使用示例:assignToSymbol[p,Table[p[i],{i,3}],{1,2,3}],然后assignToSymbol[p,Table[p[i],{i,3}],{4,5,6}。还可以制作更复杂的版本,自动检测l.h.s上的哪些符号需要分块