假设有两个列表a = {a1, a2, a3}
and b = {b1, b2, b3}
,我想写一个赋值语句来做a1=b1,a2=b2,a3=b3
只引用a
and b
:
Thread[a = b]
但它只会使a={b1,b2,b3}
. 使用:=
(SetDelayed) 代替=
也不起作用。
有什么解决办法吗?谢谢。
假设有两个列表a = {a1, a2, a3}
and b = {b1, b2, b3}
,我想写一个赋值语句来做a1=b1,a2=b2,a3=b3
只引用a
and b
:
Thread[a = b]
但它只会使a={b1,b2,b3}
. 使用:=
(SetDelayed) 代替=
也不起作用。
有什么解决办法吗?谢谢。
我认为Thread
唯一适用于“显式”列表;在操作之前需要扩展变量。
经过一些实验,这对我有用:
a = {a1, a2, a3}; b = {b1, b2, b3}; 线程[Set[Evaluate@a, Evaluate@b]]; {a1,a2,a3}
你也可以写Thread[Evaluate@a = Evaluate@b]
;只取决于您发现哪个更具可读性。
有什么问题
MapThread[Set,{{a1,a2,a3},{b1,b2,b3}}]
?
这是另一个解决方案:
a = {a1, a2, a3};
b = {b1, b2, b3};
each[{x_, y_}, Transpose[{a, b}],
x = y]
它使用了我方便的each
功能:
SetAttributes[each, HoldAll]; (* each[pattern, list, body] *)
each[pat_, lst_, bod_] := (* converts pattern to body for *)
Scan[Replace[#, pat:>bod]&, Evaluate@lst] (* each element of list. *)
同样,您可以这样做:
MapThread[(#1 = #2)&, {a, b}]
好吧,如果它们真的被称为a1
,a2
等,你可以这样做:
Assign[x_, y_] := Module[{s1, s2, n, sn},
s1 = SymbolName[Unevaluated[x]];
s2 = SymbolName[Unevaluated[y]];
For[n = 1, n <= Length[x] && n <= Length[y], n++,
sn = ToString[n];
Evaluate[Symbol[s1 <> sn]] = Evaluate[Symbol[s2 <> sn]]
]
]
SetAttributes[Assign, HoldAll]
进而
Clear[b1, b2, b3];
Clear[a1, a2, a3];
a = {a1, a2, a3}
b = {b1, b2, b3}
Assign[a, b]
a
给出 和的结果a
:b
a
{a1, a2, a3}
{b1, b2, b3}
{b1, b2, b3}
正如预期的那样。
一般来说,您可以通过正确使用SymbolName
and来创建这样的表达式Symbol
,但要小心您的评估。如果我写了SymbolName[x]
(没有Unevaluated
),那么它会将其解释为SymbolName[{a1, a2, a3}]
,这显然是不可取的。不使用Evaluate
onSymbol[s1 <> sn]
会使 Mathematica 抱怨您正在尝试重新分配Symbol
函数。