Definition
“知道”符号值的定义方式:使用Set
or SetDelayed
。但如何呢?据我了解,在为符号分配值后,评估器的分配方式没有任何区别:通过使用Set
or SetDelayed
。可以用函数来说明OwnValues
它总是返回定义Head
RuleDelayed
. How 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]
gives {HoldPattern[a] :> 3}
代替{HoldPattern[a] -> 3}
but Definition[a]
展示了人们可以期待什么。可能这个定义在内部以以下形式存储Rule
但转换为RuleDelayed
by OwnValues
用于抑制定义的 r.h.s 的评估。这个假设与我最初的理解相矛盾,我最初的理解是分配的值之间没有区别Set
and SetDelayed
。这些定义可能以不同的形式存储:Rule
and RuleDelayed
相应地,但从评估者的角度来看是等效的。
有趣的是看看如何MemoryInUse[]
取决于定义的类型。
在下面的实验中我使用了内核数学5.2 在没有前端的交互式会话中。与内核数学6和7会得到不同的结果。原因之一是在这些版本中Set默认情况下是重载的.
首先我评价一下$HistoryLength=0;
因为有DownValues
for In
and Out
变量不影响我的结果。但似乎即使当$HistoryLength
的值设置为 0In[$Line]
for current输入行仍然被存储并在输入新输入后被删除。这可能就是第一次评估结果的原因MemoryInUse[]
总是与第二个不同。
这是我得到的:
Mathematica 5.2 学生版:Microsoft Windows 版本
版权所有 1988-2005 Wolfram Research, Inc.
-- 终端图形初始化 --
在[1]中:= $HistoryLength=0;
In[2]:= MemoryInUse[]
输出[2]= 1986704
In[3]:= MemoryInUse[]
输出[3]= 1986760
In[4]:= MemoryInUse[]
输出[4]= 1986760
在[5]中:=a=2;
In[6]:= MemoryInUse[]
输出[6]= 1986848
In[7]:= MemoryInUse[]
输出[7]= 1986824
In[8]:= MemoryInUse[]
输出[8]= 1986824
在[9]:= a:=2;
In[10]:= MemoryInUse[]
输出[10]= 1986976
In[11]:= MemoryInUse[]
输出[11]= 1986952
In[12]:= MemoryInUse[]
输出[12]= 1986952
在[13]中:= a=2;
In[14]:= MemoryInUse[]
输出[14]= 1986848
In[15]:= MemoryInUse[]
输出[15]= 1986824
In[16]:= MemoryInUse[]
输出[16]= 1986824
人们可以看到定义a=2;
增加MemoryInUse[]
由 1986824-1986760=64 字节。将其替换为定义a:=2;
增加MemoryInUse[]
1986952-1986824=128 字节。并将后一个定义替换为前一个恢复MemoryInUse[]
至 1986824 字节。这意味着延迟定义比立即定义多需要 128 个字节。
当然这个实验并不能证明我的假设。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)