关于->和:>的一些疑问
mathematica吧
全部回复
仅看楼主
level 4
在对列表进行替换时出现一些没能理解的问题,代码如下:
{{1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}} /.{a_, b_} -> {If[OddQ[b], 1, 0], b}
{{1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}} /.{a_, b_} :> {If[OddQ[b], 1, 0], b}
{{1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}} /.{a_, b_} -> {If[b > 2, 1, 0], b}
代码运行结果如下:
第一条代码运行时,奇数判定没有起效果,我认为是因为文档中提到的:表示奇整数但不直接计算的表达式依然给出 False。
但是当把->换成规则延迟:>后,代码2中IF能够正常运行,说实话我实在没能理解为什么能够正常运行。
同样我也不太理解,为什么代码3可以正常运行,而代码1不可以。
希望各位大佬答疑解惑,在这行代码运行的过程中,软件是以什么样的顺序进行计算的,变量的值是什么时候发生变化的,什么原因造成了运行结果的差异,谢谢。
2020年06月05日 08点06分 1
level 4
结果图的顺序错了,正确的顺序是:
2020年06月05日 08点06分 2
level 7
首先解释一下->和:>的区别,简单地说就是什么时候计算右边,对于->,右边是先计算出来的,而:>是左边匹配到具体的内容时再计算的,因此一般来说,用:>多半是没错的。
比如你可以试试给b提前赋值,再运行这三个例子,可以看到,1和3的b完全变成你所赋的值,而不会受匹配内容的影响。
至于1和3为什么不同,是因为If[b > 2, 1, 0]无法判断是哪种情况,因此保留了这种形式,留待匹配之后替换再进一步化简,而OddQ[b]对于不能判断为True的情况一律给出False(所有XxxQ的函数都有这个特点),因此1中的第一项总是为0。
你可以尝试一下If的第四个参数,它在不确定True或False的情况下会给出第四个参数,你可以再试试这三个例子,结果有什么不同。
2020年06月05日 15点06分 3
“因此一般来说,用:>多半是没错的”关于这个请看《:=和=均可用于函数定义,请不要盲目地只使用其中之一!》(https://tieba.baidu.com/p/6597084456)道理是一样的。
2020年06月06日 01点06分
确实也存在只能用->不能用:>的情况,”用:>多半是没错的“只是个人的经验与感觉。楼主能理解二者的区别是最好的,理解不了也不太影响使用,总之一种不对换另一种就是了。
2020年06月06日 06点06分
@hjq447285628 对这两个符号能接更深了一些,谢谢解答[太开心]
2020年06月06日 16点06分
level 4
我可以理解为:
->在替换的时候,在局部变量赋值前计算了一次右边,赋值后又计算了一次右边
:>只在局部变量被赋值后计算了一次右边
(局部变量这里指的是{a_,b_}->{f[a],f[b]}中的a,b)
2020年06月06日 15点06分 4
对于:>的情况,由于a,b在计算过程中只是一种符号(像是盛着值的容器?),所以即使在全局对a,b进行了赋值,也不影响匹配的结果。
2020年06月06日 15点06分
还是不太对。Rule里的{f[a], f[b]}只会算一次,而非每次匹配前都算。建议Trace一下。
2020年06月06日 15点06分
@xzcyr Trace之后发现了Rule里的{f[a], f[b]}的确是只在最开始计算一次,谢谢解答[太开心]
2020年06月06日 16点06分
吧务
level 15
一个体现4楼楼主理解错误之处的例子:
b=0;{1,2}/.a_Integer/;(b++;True)->b
2020年06月06日 15点06分 5
1