【发布时间】:2016-01-01 01:42:18
【问题描述】:
参考 Julia 文档:
在 Julia 中,函数的所有参数都通过引用传递。
当我从匿名函数中获取 Float64 参数的内存地址时,它看起来是正确的。但对于命名函数则不是这样。
test = function (a::Float64)
println(pointer_from_objref(a));
end
# => (anonymous function)
function test1(a::Float64)
println(pointer_from_objref(a));
end
# => test1 (generic function with 1 method)
value=0.0;
println(pointer_from_objref(value))
# => Ptr{Void} @0x00007fe797c5c020
test(value)
# => Ptr{Void} @0x00007fe797c5c020
test1(value)
# => Ptr{Void} @0x00007fe799e83960
正如@Gnimuc 提到的,Julia-Lang Doc 中还有一段解释了参数传递行为
Julia 函数参数遵循有时称为的约定 “pass-by-sharing”,这意味着值不会被复制 被传递给函数。函数参数本身充当新的 变量绑定(可以引用值的新位置),但 它们引用的值与传递的值相同。
这种“通过分享”的行为和上面的代码有什么关系吗?
【问题讨论】:
-
AFAIK 函数的所有参数都是通过引用传递的,但数字和字符等纯数据除外。尝试在这些函数中更改您的浮点数......同时您发现了一些与该规则相矛盾的东西。非常有趣的问题。我期待看到答案。
-
来自doc:“函数参数本身充当新的变量绑定(可以引用值的新位置),但它们引用的值与传递的值相同。”我想知道
location这个词在这里是什么意思。