【问题标题】:How to pass an object by reference and value in Julia?如何在 Julia 中通过引用和值传递对象?
【发布时间】:2019-09-28 21:05:35
【问题描述】:

我从here知道:

Julia 函数参数遵循有时称为“传递共享”的约定,这意味着在将值传递给函数时不会复制它们。函数参数本身充当新的变量绑定(可以引用值的新位置),但它们引用的值与传递的值相同。在函数内对可变值(例如数组)所做的修改将对调用者可见。这与 Scheme、大多数 Lisps、Python、Ruby 和 Perl 以及其他动态语言中的行为相同。

鉴于此,我很清楚,要通过引用传递,您需要做的就是拥有一个可变类型,将其传递给函数并进行编辑。

然后我的问题就变成了,我怎样才能清楚地区分值传递和引用传递?有没有人有一个例子显示一个函数被调用了两次?一次通过引用传递,一次通过值传递?

我看到this post 暗示了一些类似的想法,但它并没有完全回答我的问题。

【问题讨论】:

标签: julia


【解决方案1】:

在 Julia 中,函数始终具有传递共享参数的行为:

https://docs.julialang.org/en/v1/manual/functions/

这种参数传递约定也用于大多数通用动态编程语言,包括各种 Lisps、Python、Perl 和 Ruby。可以在这里找到一个很好且有用的描述:

https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing

简而言之,传递共享的工作方式类似于传递引用,但您无法通过重新分配被调用函数中的参数来更改调用范围内的绑定所引用的值 - 如果重新分配参数,则调用者中的绑定没有改变。这意味着通常您不能使用函数来更改绑定,例如交换到变量。 (但是,宏可以修改调用者中的绑定。)特别是,如果调用者中的变量引用了一个不可变的值,如整数或浮点数,则它的值不能被函数调用更改,因为哪个对象变量引用不能被函数调用改变,值本身不能修改,因为它是不可变的。

如果您想要 R 或 Matlab 之类的按值传递行为,则需要在修改参数之前显式创建参数的副本。这正是 R 和 Matlab 所做的,当一个参数以修改后的形式传递并且对该参数的外部引用仍然存在时。在 Julia 中,它必须由程序员显式完成,而不是由系统自动完成。缺点是系统有时可以知道不需要副本(不保留外部引用),而程序员通常无法知道这一点。然而,这种能力与引用计数垃圾回收技术密切相关,出于性能考虑,Julia 并未使用该技术。

按照惯例,改变参数内容的函数有一个! 后缀(例如,sort v/s sort!)。

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2011-09-27
    • 2013-06-27
    • 2018-04-03
    • 2011-03-03
    相关资源
    最近更新 更多