b=5
ff(x,a=b,b=1) = (a+b,x)
ff(3)
运行一下,豁然开朗。
julia> ff(x,b=1,a=b) = (a+b,x)
ff (generic function with 3 methods)
julia> ff(3)
(2, 3)
我也是接触Julia好久之后,才意识到这个的,比如,这里会从前面的参数里拿到值,而不是外部的作用域里。
您这个更深刻!
尝试理解:外部作用域没有全局和局部的概念,仅仅是它的上一个出现的。
我一直没意识到这个,但是我一直都没有遇到问题。我的朴素的理解就是先来后到。
b=5
ff(x,a=b,b=1)=(a+b,x)
a=b
的时候,后面的 b=1
还没有,因此用的就是外部的 b
.
b=5
ff(x,b=1,a=b) = (a+b,x)
这种时候我能够理解 a=b
是指 b=1
因为我一直以来都是这么用的,后来的 b=1
已经覆盖了外部的
b=5
,所以 a=1
.
当然,实际中可能不是这么回事,我用的时候这样写是因为后续的参数 a
的值一般是依赖于前面的 参数 b
的值的。
所以从来没遇到过在
b=5
ff(x,b=1,a=b) = (a+b,x)
这种情况下需要把 a
默认为 5
的情况。
我的理解是这样的
ff(x,b=1,a=b)=(a+b,x)
会生成3个方法
ff(x)
ff(x, b)
ff(x, b, a)
所以它展开是如下形式:
function ff(x, b, a)
(a+b, x)
end
function ff(x, b)
a = b
ff(x, b, a)
end
function ff(x)
b = 1
ff(x, b)
end
所以它输出和外部变量的b是无关的
如果函数定义变为
ff(x,a=b,b=1)=(a+b,x)
这个时候会变成
function ff(x, a, b)
(a+b, x)
end
function ff(x, a)
b = 1
ff(x, a, b)
end
function ff(x)
a = b
ff(x, a)
end
这时再调用ff(3)时,因为b在函数内部没有定义,所以会从全局变量中找b,得到的结果就不一样。
如果全局没有定义b,就会出错
julia> ff(3)
ERROR: UndefVarError: b not defined