如何设置值符号
回答
好吧,让我们试试吧天真:
做一个列表:
In[1]:= ClearAll[list, a, b, c];
list = {a, b, c};
这是因为我们预计:
In[3]:= list
Out[3]= {a, b, c}
设置的第一个元素,以2:
In[4]:= list[[1]] = 2
Out[4]= 2
In[5]:= list
Out[5]= {2, b, c}
这并不影响:
In[6]:= a
Out[6]= a
重新开始:
In[7]:= ClearAll[list, a, b, c];
list = {a, b, c};
In[9]:= list
Out[9]= {a, b, c}
的问题是,设置(=)具有HoldFirst
作为它的一个属性,即它不评估是左手边的第一个参数,以及分配给列表而不是在那个位置的变量。但是你可以使用Evaluate
力评价:
In[10]:= Evaluate[list[[1]]] = 2
Out[10]= 2
现在的名单似乎是和以前一样:
In[11]:= list
Out[11]= {2, b, c}
但那只是因为仍然存在,并已得到的2值(以在以前的版本是换成2):
In[12]:= a
Out[12]= 2
如果现在设置了3个,你会看到,太多的变化列表:
In[13]:= a = 3
Out[13]= 3
In[14]:= list
Out[14]= {3, b, c}
编辑
也许更接近你的问题的措辞,你可以Map
Set
在名单:
In[16]:= ClearAll[list, a, b, c];
list = {a, b, c};
In[18]:= Set[#, RandomInteger[10]] & /@ list
Out[18]= {4, 8, 1}
In[19]:= list
Out[19]= {4, 8, 1}
In[21]:= {a, b, c}
Out[21]= {4, 8, 1}
很好的答案。简单,有用,信息丰富。 +1 – 2011-04-18 22:46:57
应该注意的是'Evaluate [list [[1]]] = 2'只有在'a'没有任何价值时才能使用。除了编辑部分:'{a,b,c} = {1,2,3}'也可以。 – 2011-04-19 03:58:38
@Alexey是的,这也可以工作,但我认为OP有一个很长的变量列表,他想更自动地处理这些变量。第一个评论+1。事实上,在a得到一个值'Evaluate [list [[1]]]之后'评估它的值而不是符号。 – 2011-04-19 05:52:02
也许你可以这样做:
setSymbol[symbol_, value_] := Module[{},
ToExpression[
SymbolName[symbol] <> "=" <> ToString[value,TotalWidth->Infinity]
]
]
setSymbol[list[[1]], 2]
虽然这可能是一个有点hackish。正确的方法是通过玩弄价值如何被评估,但我不记得如何;查看其他答案。
非常hackish的,目前有错误,这将有助于。 'list [1]'应该是'list [[1]]',''=''应该是''=“',你可能打算使用'ToExpression'而不是'Evaluate'来将字符串转回成为将评估的东西。 – 2011-04-18 20:21:38
你要求什么一般是很难的数学,因为很难模仿指针语义。下面的代码将做具体你问什么,但仅限于符号列表元素:
ClearAll[setPart];
SetAttributes[setPart, HoldFirst];
setPart[lst_Symbol, i_, value_] :=
With[{heldPart = [email protected][Hold[lst] /. OwnValues[lst], {{1, i}}, Hold]},
If[MatchQ[heldPart, Hold[_Symbol]],
Set @@ Append[heldPart, value],
lst[[i]] = value]];
例子:
In[117]:= Clear[list, a, b]
list = {a, b, c, 4, 5};
a = 1;
b = 3;
list
Out[121]= {1, 3, c, 4, 5}
In[122]:= setPart[list, 1, 10];
{a, list}
Out[123]= {10, {10, 3, c, 4, 5}}
In[124]:= setPart[list, 5, 10];
list
Out[125]= {10, 3, c, 4, 10}
我也有类似的问题,定义符号的价值,当你第一次不知道你想重新定义的符号时。你的回答帮助我找到了正确的方法:
HoldPattern对我来说工作得很好,即使值已经为变量设置了allready。
In[253]:= Clear[a,b,c,d,list]
list = HoldPattern/@{a,b,c,d};
a=2;
Evaluate[list[[1]]]=1;
list//ReleaseHold
a
Out[257]= {1,b,c,d}
Out[258]= 1
所以我的解决办法是很像由Sjoerd C.德弗里斯第一个解决方案,但它从列表中HoldPattern内被评估保护的符号。
请注意,必须使用ReleaseHold才能使用该列表进行进一步计算。变量(a,b,c,d)不会受到这种结构的影响。
这是我的第一篇文章在这里,希望你喜欢它;-)
- 1. 如何为输入类型编号字段设置%符号
- 2. 设置选项轨符号
- 3. 将插入符号的值设置到某个位置后不能得到插入符号位置值
- 4. JFreechart将字符串值和/或符号设置为Xaxis
- 5. 如何设置RightClick位置上的插入符号?
- 6. 如何设置extJS标记域中的插入符号位置
- 7. Emacs:如何设置标点符号/ C运算符的颜色?
- 8. 在dylib中设置字符集符号
- 9. VB.NET:如何总是在文本框中预先设置美元符号值
- 10. 如何使用占位符字符设置JFormattedTextField的值?
- 11. 设置占位符值
- 12. 如何设置java DayOfWeek值?
- 13. 如何设置errno值?
- 14. 如何设置所选值
- 15. 如何设置SPFieldDateTime的值?
- 16. 我如何设置plist值
- 17. 设置如何XAttribute NULL值
- 18. 如何设置Map.entrySet()的值
- 19. 如何设置div值
- 20. 如何设置值NLog.config
- 21. 如何设置cookie值?
- 22. C#PropertyBuilder:如何设置值?
- 23. 如何设置默认值?
- 24. Doctrine2如何设置Id值
- 25. 如何设置Gtk.ComboBox的值?
- 26. 如何设置属性值
- 27. 如何设置值kCFCalendarUnitWeekday
- 28. 如何在DataView中设置带符号的24位整数?
- 29. 如何在ActionScript/Flex 3中取消设置(无符号)整数?
- 30. 如何通过.props文件设置调试符号路径
如果我们知道的错误列表[[1]] = 2抛出 – ninjagecko 2011-04-18 20:06:10