Wolfram mathematica 关于符号的定义和价值的问题
Wolfram mathematica 关于符号的定义和价值的问题,wolfram-mathematica,Wolfram Mathematica,Definition“知道”符号值的定义方式:使用Set或SetDelayed。但是怎么做呢?据我所知,分配符号值后,计算器的分配方式没有任何区别:使用Set或SetDelayed。它可以通过函数OwnValues来说明,该函数总是返回带有标题的定义。Definiton如何获得此信息 In[1]:= a=5;b:=5; Definition[a] Definition[b] OwnValues[a] Out[2]= a=5 Out[3]= b:=5 Out[4]= {HoldPattern[a
Definition
“知道”符号值的定义方式:使用Set
或SetDelayed
。但是怎么做呢?据我所知,分配符号值后,计算器的分配方式没有任何区别:使用Set
或SetDelayed
。它可以通过函数OwnValues
来说明,该函数总是返回带有标题的定义。Definiton
如何获得此信息
In[1]:= a=5;b:=5;
Definition[a]
Definition[b]
OwnValues[a]
Out[2]= a=5
Out[3]= b:=5
Out[4]= {HoldPattern[a]:>5}
信息
调用定义
,而定义
(或完整定义
)上的跟踪不显示任何内容。我必须假设这是一个访问*值
表之外数据的低级函数。也许它保留了原始定义表达式的一个副本,因为它们在当时被解析。OwnValues[a]={HoldPattern[a]->3};OwnValues[a]
给出了{HoldPattern[a]:>3}
而不是{HoldPattern[a]->3}
,但是定义[a]
显示了人们可以期望的结果。该定义可能以Rule
的形式存储在内部,但通过OwnValues
转换为RuleDelayed
,以抑制对定义的r.h.s的评估。这个假设与我最初的理解相矛盾,即Set
和SetDelayed
指定的值之间没有差异。这些定义可能以不同的形式存储:Rule
和RuleDelayed
,但从评估者的角度来看,它们是等效的
有趣的是,看看MemoryInUse[]
如何依赖于定义的类型
在下面的实验中,我在没有前端的交互式会话中使用了Mathematica 5.2的内核。使用Mathematica 6和7的内核,将得到不同的结果。原因之一是
首先,我计算$HistoryLength=0代码>用于具有不影响我的结果的In
和Out
变量的down值。但是,即使将$HistoryLength
设置为0,[$Line]
中当前输入行的值在输入新输入后仍然被存储和删除。这可能就是为什么MemoryInUse[]
的第一次评估结果总是与第二次不同的原因
以下是我得到的:
Mathematica 5.2学生版:Microsoft Windows版本
版权所有1988-2005 Wolfram研究公司
--终端图形已初始化--
[1]中:=$HistoryLength=0
在[2]:=MemoryInUse[]
Out[2]=1986704
在[3]:=MemoryInUse[]
Out[3]=1986760
在[4]:=MemoryInUse[]
Out[4]=1986760
[5]中:=a=2
在[6]:=MemoryInUse[]
Out[6]=1986848
在[7]:=MemoryInUse[]
Out[7]=1986824
在[8]:=MemoryInUse[]
Out[8]=1986824
在[9]:=a:=2
在[10]:=MemoryInUse[]
Out[10]=1986976
在[11]:=MemoryInUse[]
Out[11]=1986952
在[12]:=MemoryInUse[]
Out[12]=1986952
[13]中:=a=2
在[14]:=MemoryInUse[]
Out[14]=1986848
在[15]:=MemoryInUse[]
Out[15]=1986824
在[16]:=MemoryInUse[]
Out[16]=1986824
可以看出,定义a=2代码>将内存使用[]
增加1986824-1986760=64字节。将其替换为定义a:=2代码>将内存使用[]
增加1986952-1986824=128字节。用前一个定义替换后一个定义将MemoryInUse[]
还原为1986824字节。这意味着延迟定义需要比立即定义多128字节
当然,这个实验并不能证明我的假设。符号的完整定义可以通过未记录的八合一符号语言`扩展定义
和语言`扩展完整定义
来访问。引用:
“如果有人好奇,Language`ExtendedDefinition
和Language`ExtendedFullDefinition
类似于Definition
和FullDefinition
,但捕获符号的定义的方式可以在另一个内核中复制。例如,defs=Language`ExtendedFullDefinition[sym]
返回Language`DefinitionList
对象。用于还原定义的语法非常不规则:Language`ExtendedFullDefinition[]=defs
,其中defs
是Language`DefinitionList
。请注意Language`ExtendedFullDefinition
采用ExcludedContexts
选项,而Language`ExtendedDefinition
不采用该选项。”另一个好问题Alexey.有一个非常重要的用例,它对作业中使用的内容产生了真正的影响-Set
或SetDelayed
:作业的部分。对抗tst={1,2,3};tst[[2]=5;tst
(工作正常)与tst1:={1,2,3};tst1[[2]=5
(给出赋值错误,tst1的“无立即值”)当然,tst
和tst1
的OwnValues
看起来是一样的,正如您所观察到的。根据您对内存消耗的观察,我猜延迟定义可能会使用一些中间内部变量,而立即定义则直接指向存储数据的内存。而不是在解析时:a=1+1;定义[a]
给出a=2
。我假设在真的OwnValues
中保留定义上的信息,但不显示:如果我们计算OwnValues[a]={HoldPattern[a]>3};