3

我想制作一个可以初始化和可访问的变量列表。
在那种代码之后:

abc = {a, b, c}
{a, b, c} = {0, 0, 0}
abc[[1]] = 1

以其他方式,我想创建一个变量列表,用零初始化它们,然后通过引用变量指示列表而不是使用单个变量的名称来更改它们。

如果你愿意

abc = {a, b, c}
Evaluate[abc[[1]]] = 1

您得到了正确的结果,即变量 a 设置为 1。但是在第一次设置之后,您无法使用上述方法为该变量设置另一个值。

更多细节
我想创建 SetterBars 列表,其中每个都独立于其他,我可以以某种方式存储它们的值。更重要的是,我希望它们被初始化为零。就像是

abc = {a, b, c};
Evaluate[abc] = {0, 0, 0};
Table[SetterBar[Dynamic[ abc[[i]] ],{-1,1}], {i,3}]
4

2 回答 2

1

我相信这可以简化,但至少它确实有效:

     {a, b, c} = {0, 1, 0}; 
        {
          With[{abc = {Unevaluated[a], Unevaluated[b], Unevaluated[c]}}, 
               tab = Table[With[{abci = abc[[i]]}, 
                                SetterBar[Dynamic[abci], {0, 1}]], {i, 3}]; 
               tab /. Dynamic[Unevaluated[x_]] :> Dynamic[x]
          ], 
         Dynamic[{a, b, c}]
        }
于 2012-12-06T11:19:31.597 回答
1

解决方案

简单的答案是使用索引对象而不是符号:

x[_] = 0;

Array[SetterBar[Dynamic @ x @ #, {0, 1}] &, 3] // Row

Array[Dynamic @ x @ # &, 3]

数学图形

您不仅限于用户数字索引。例如:

SetterBar[Dynamic @ x @ #, {0, 1}] & /@ {"one", "two", "three"}

Dynamic @ x @ # & /@ {"one", "two", "three"}

参考

有关更完整的示例和其他选项,请参阅:按表包装 EventHandler 。

对于执行您描述的符号分配的方法,即使我在这里不推荐它,请参阅: Assigning values to a list of variable names,以及:(1)(2)(3)(4)

于 2012-12-08T13:17:07.587 回答