网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月20日漏签0天
mathematica吧 关注:19,932贴子:74,225
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 9回复贴,共1页
<<返回mathematica吧
>0< 加载中...

赋值给ToExpression["a"],结果却无法影响a的值?

  • 只看楼主
  • 收藏

  • 回复
  • 泥萌都
  • 有待掌握
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在12.3.1环境运行下面:
Unprotect[ToExpression];
a = 123;
ToExpression["a"] = 456;
{a, ToExpression["a"]}
得到:{123, 456}
① 我疑惑为啥a没有变成456?
② 有没有办法以符号名字符串"a"作为参数,给符号a赋值?让输出都是456?


  • 乙己☄
  • 大写小写
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不知道你要的是不是这种效果


2026-01-20 12:08:01
广告
不感兴趣
开通SVIP免广告
  • Lingjin_Hong
  • ()[]区别
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
a = 123
toexpre[str_, num_] := ToExpression[str <> "=" <> ToString[num]]
{a, toexpre["a", 456]}
a


  • 无影东瓜
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
挺有意思的问题,可以分成两部分解答:
1. 为什么直接运行ToExpression["a"] = 456会报错
简单来说,因为赋值语句Set具有HoldFirst属性,因此左侧的ToExpression["a"]不会自动计算为a,而ToExpression["a"]本身并不是一个可被赋值的表达式,类似的例子包括(x+3)=5、Length[y]=3等等。如果对C++中的左值、右值概念有一定了解的话,这里理解起来会更容易一些。
知道了问题产生的原因,解决的思路也就有了,在Set运行之前使ToExpression["a"]计算即可,Evaluate、Activate+Inactive、ReleaseHold+Hold等都可以达成目标
Clear["a"];
Evaluate[ToExpression["a"]] = 3;
Clear["a"];
Activate[Inactive[Set][ToExpression["a"],3]]
Clear["a"];
ReleaseHold[Hold[Set][ToExpression["a"],3]]
需要注意的是,如果a本身已经被赋值,ToExpression["a"]得到的数值也很可能是不可被赋值的表达式,因此需要先运行Clear
另,对于这种字符串转变量名的操作,个人建议用Symbol["a"]替代ToExpression["a"]
2. 为什么Unprotect[ToExpression]后上述语句可以运行,但得到的结果不符合预期
因为Unprotect[ToExpression]后,ToExpression["a"]=3类似于f["a"]=3,赋值改变的是ToExpression的DownValue,而非a的OwnValue
换句话说,运行这一语句后,ToExpression["a"]和变量a就完全没有关系了
最后补充一下,我个人非常不建议在MMA中使用这种字符串直接到变量名的赋值方式,使用DownValue或Association都是更好的选择


  • 隨意超
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
让Set支持符号名赋值
Unprotect[Set];
(l_String = r_) := ToExpression[l, InputForm, Function[s, s = r, HoldAll]];
"a" = 456;
这主要依靠ToExpression第3参数和Hold*属性,这种指定计算顺序的元编程全是技巧,一般我会避免这样用


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 9回复贴,共1页
<<返回mathematica吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示