Wolfram mathematica 如何在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评估为可
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
分配给symbola
,还是分配给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上的哪些符号需要分块