An example for 官方文档-函数-默认值作用域

b=5
ff(x,a=b,b=1) = (a+b,x)
ff(3)

运行一下,豁然开朗。

1 个赞
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 的情况。

1 个赞

我的理解是这样的

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