簡體   English   中英

Julia-Lang匿名vs傳遞參數的命名函數行為

[英]Julia-Lang anonymous vs named function behavior in passing argument

請參閱Julia doc:

在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還有另一段解釋了Argument Passing Behavior

Julia函數參數遵循有時稱為“pass-by-sharing”的約定,這意味着值在傳遞給函數時不會被復制。 函數參數本身充當新的變量綁定(可以引用值的新位置),但它們引用的值與傳遞的值相同。

這種“傳遞共享”行為與上述代碼之間是否存在任何關系?

從Julia文檔中的pointer_from_objref(object_instance)函數我們得到這樣的描述:

獲取Julia對象的內存地址作為Ptr。 生成的Ptr的存在不會保護對象不被垃圾收集,因此您必須確保在Ptr將被使用的整個時間內對象保持引用。

檢查以下測試:

x=10
y=10
println(pointer_from_objref(x)) # => Ptr{Void} @0x039ee2c0
println(pointer_from_objref(y)) # => Ptr{Void} @0x039ee2c0

我們可以看到pointer_from_objref無法返回不可變對象的本地地址,這是因為這個對象是按值傳遞的,所以我認為上面問題的答案是在那里濫用了pointer_from_objref

擴展Reza的答案,這里需要注意的是“pass-by-sharing”推理不適用於不可變對象。 如果你嘗試相同的代碼,但使用浮動向量作為參數,你會得到預期的行為,即所有指針是相同的:

    test = function (a::Vector{Float64})
        println(pointer_from_objref(a));
    end

    # => (anonymous function)
    function test1(a::Vector{Float64})
        println(pointer_from_objref(a));
    end

    # => test1 (generic function with 1 method)
    value=[0.0,0.1];

    println(pointer_from_objref(value))
    # => Ptr{Void} @0x0000000084601be0
    test(value)
    # => Ptr{Void} @0x0000000084601be0
    test1(value)
    # => Ptr{Void} @0x0000000084601be0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM