Re: [问题] 用String设定数值阵列

楼主: chungyuandye (养花种鱼数月亮赏星星)   2013-06-07 20:39:33
※ 引述《TTLLIU (kerker)》之铭言:
: Code:
: hz = StringToStream[h1];
: h2 = ReadList[hz, Word];
: Close[hz];
: ToExpression[h2[[1]]]={1,2,3}
: 简单说明一下:
: (1)h1本身是包含空格的String
: (2)h2则把h1的每段String用空格为依据切成好几个Word存成List
: (3)第三步我则想要令h2中的Word为某个数值List
: 前两步都没有问题,但是第三步会跳出错误讯息
: Set::write: Tag ToExpression in ToExpression[Energy] is Protected.
: 这里的Energy就是存在h2[[1]]中的字符。
: 目前看起来是lhs=rhs这个指令对lhs有所限制,
: 不过总觉得我的思考方向可能有根本的错误.........
: 不晓得有没有高手可以指点一下呢?感恩。
Clear["Global`*"];
h1 = "ab bc cd";
data = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
hz = StringToStream[h1];
h2 = ReadList[hz, Word];
MapThread[Set[Evaluate@ToExpression[#1], #2] &, {h2, data}];
ab
bc
cd
作者: LPH66 (-6.2598534e+18f)   2013-06-07 21:41:00
解释一下, 这是因为 Set (=) 具有 HoldFirst 属性,所以第一个参数会保留原状 (这通常是想要的, 例如 a = 3 时我们显然不该去求 a 的值而是将 a 这变量设为 3但这里这就造成了问题) Evaluate 就是强制求值的意思在被保留的参数上用 Evaluate 则被套用的东西就会强制算完所以能够以此来达成动态设定变量的目的
作者: TTLLIU (kerker)   2013-06-07 22:13:00
感谢两位解释 非常有用的资讯!!

Links booklink

Contact Us: admin [ a t ] ucptt.com