Mathematica AppendTo 一个函数中的列表,它被传递给列表

Mathematica AppendTo a list in a function, which is handed the list

我正在尝试将一个值附加到列表,我将其交给函数,例如:

p = {{"Blaaaa"}};
AppendTo[p, {"Lalala"}];
dran [h_] := AppendTo[h, {"Hahaha"}]
dran[p]

但我收到以下错误:

AppendTo: {{Blaaaa},{Lalala}} 不是一个有值的变量,所以它的值不能改变。

我不明白。我的意思是我没有改变任何价值观。任何帮助将不胜感激。

错误的原因是在mathematica中默认情况下函数参数通过复制有效传递并且不能被修改。 AppendTo (与所有以 To 结尾的数学内在函数一样)实际上修改了它的参数。设置 HoldFirst 属性可让您修改参数。

p = {{"Blaaaa"}};
SetAttributes[dran, HoldFirst]
dran[h_] := AppendTo[h, {"Hahaha"}]
dran[p]

{{"Blaaaa"}, {"Hahaha"}}

请注意 p 本身已更改。

p

{{"Blaaaa"}, {"Hahaha"}}

请注意,如果您尝试将此函数与文字参数一起使用,您会回到同样的问题:

dran[{{"xyz"}}]

{{"xyz"}} is not a variable with a value, so its value cannot be changed

使用普通的 Append 可能更好,它可以在没有 HoldFirst 的情况下工作并且保持输入参数不变。

p = {{"Blaaaa"}};
dran[h_] := Append[h, {"Hahaha"}]
dran[p]
p

{{"Blaaaa"}, {"Hahaha"}}

{{"Blaaaa"}}