如题,最近看到别人的一段代码,里面同时出现了LinearAlgebra.norm()和norm()两个函数。
我知道norm()是求向量或矩阵的p阶范数的函数,LinearAlgebra.norm()貌似也是同样的功能。那为什么同一段代码里两者都会出现呢?它们之间有什么区别?
如题,最近看到别人的一段代码,里面同时出现了LinearAlgebra.norm()和norm()两个函数。
我知道norm()是求向量或矩阵的p阶范数的函数,LinearAlgebra.norm()貌似也是同样的功能。那为什么同一段代码里两者都会出现呢?它们之间有什么区别?
应该是实现不同,norm 如果不是 julia 的自带函数,就是他自己实现的。另一个则是包里面的。
先
methods(函数名)
看一下签名。
谢谢,我试了一下,methods两个后的结果竟然一模一样…会不会这两个函数实际就是同一个函数?只是作者检查代码不仔细,没有把形式统一?
如果前面写过 using LinearAlgebra
那就是一样的
是这样的,举个例子,你在REPL里写println
,其实是Base
里的东西,然后因为REPL的Main
模块默认导入了Base
,所以Main
里面不加模块名字使用println
这个符号,引用到的是Base.println
这个方法。
小技巧:使用which
宏判断某个对象属于哪个模块。
julia> @which println
Base
当然,如果你在Main
里定义了一个叫做println
的东西,情况就有变化了:
julia> names(Main)
4-element Array{Symbol,1}:
:Base
:Core
:InteractiveUtils
:Main
julia> function println(x)
Base.println(x+1)
end
println (generic function with 1 method)
julia> println(1)
2
julia> @which println
Main
julia> Base.println(1)
1
julia> names(Main)
6-element Array{Symbol,1}:
:Base
:Core
:InteractiveUtils
:Main
:ans
:println
注意,此时Main.println和Base.println已经是两个东西了。
谢谢您的耐心解答,明白了。