也许有人可以向我解释为什么Replace
会给出与ReplaceAll
不同的答案,即使我使用的是一条规则,而且我认为我有一个表达式。
根据文件:
ReplaceAll looks at each part of expr, tries all the rules on it, and then goes on to
the next part of expr. The first rule that applies to a particular part is used; no
further rules are tried on that part, or on any of its subparts
和替换
A list of rules can be given. The rules are tried in order. The result of the first
one that applies is returned. If none of the rules apply, the original expr is
returned.
我有这个表达:
z/(0.5 -1.4 z+z^2)
和这一条规则
z -> Exp[I*w]
以下输入
Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Replace[hz, z -> Exp[I*w]]
ReplaceAll[hz, z -> Exp[I*w]]
得出这个结果:
z/(0.5 -1.4 z+z^2) (*from Replace*)
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w)) (*from ReplaceAll*)
所以,ReplaceAll
完成了我预期的工作,但不是Replace
。我认为我唯一想念的就是表达部分。那么也许hz不是'一个'表达?好的,很好,但它应该能够将规则至少应用到它的一部分。但它没有在任何地方做任何替换
FullForm[hz]
Times[z,Power[Plus[0.5`,Times[-1.4`,z],Power[z,2]],-1]]
不是一个表达式吗?如果没有,它有多少部分?它是TreeForm[hz]
生成的图表末尾的叶子数量吗?如果是这样,那么我在那里看到3'z',然后Replace[]
应该替换其中一个
我总是使用/.
而不考虑它,这与ReplaceAll
相同,但现在我使用Replace[]
思考与/.
相同,我发现这并注意到了不同的功能。
(这么多功能需要学习,所以时间很少:)。
答案 0 :(得分:16)
事实上,Replace
和ReplaceAll
不相同。您可以将Replace
视为更精确的版本,因为使用Replace
,您可以指定要在其上进行替换的表达式级别。这里的差异有点类似于Map
和MapAll
之间的区别,除了ReplaceAll
不能深度优先工作的细微之处(见下文)。另一个差异,也是相当微妙的,Replace
采用Heads
选项,而ReplaceAll
没有,这使得Replace
比ReplaceAll
更精确。< / p>
默认情况下,Replace
仅在<0级 <0>,即整个表达式。但是z
更深了:
In[220]:= Clear[z]
hz = z/(0.5 - 1.4 z + z^2);
Position[hz, z]
Out[222]= {{1}, {2, 1, 2, 2}, {2, 1, 3, 1}}
如果您使用Replace
的级别规范,您可以获得与ReplaceAll
类似但不总是相同的效果:
In[223]:= Replace[hz,z->Exp[I*w],{0,Infinity}]
Out[223]= E^(I w)/(0.5\[VeryThinSpace]-1.4 E^(I w)+E^(2 I w))
Replace
与lev.spec {0,Infinity}
和ReplaceAll
之间的区别在于前者在表达式之前执行深度优先的子表达式,而后者在较大的表达式中运行到部分。例如更详细地讨论它。 here。可以在this帖子中找到将这种差异用于一个优势的一个例子。
回到Replace
的默认行为,它对整个表达式进行操作:当你只想转换整个表达式但它没有任何部分(可能会意外地匹配你规则中的模式)时,它非常有用)。 Replace
的此类应用的一个示例是here。
答案 1 :(得分:9)
我认为Replace
文档的相关部分是:“在尝试转换整个表达式expr时应用规则或规则列表。”即转换整个表达。因此,
Replace[z, z -> Exp[I*w]]
会将z
转换为Exp[I*w]
,但您的示例会失败,因为该规则与整个表达式不匹配。
请注意Replace
接受参数level spec
;所以要在树的末端叶子上操作,试试
Replace[hz, z -> Exp[I*w], -1]
给
E^(I w)/(0.5 -1.4 E^(I w)+E^(2 I w))