Julia:在函数中更新Float64

时间:2018-02-12 19:07:53

标签: julia

我正在尝试创建一个更新Float64参数的函数。下面的例子应该能够澄清我想要实现的目标。

a=1.2

function fun!(a)
   a=3.4;
end

不幸的是,a仅在本地范围内更新。有办法吗?我认为传递指向函数的指针可能会有所帮助,但我不知道如何在Julia中执行此操作。

2 个答案:

答案 0 :(得分:4)

你不能这样做。 Float64不是可变值,因此您无法改变a的值。您只能将a替换为单独的Float64。这就是不可变的价值。

更低的级别(通常是真的,虽然有例外):Float64 s由它们的实际字节表示,而mutable是指向实际字节的指针。 mutable的实际值是它的指针。变异意味着更改指针指向的内存位置的值,但对于不可变的内存不存在。

答案 1 :(得分:2)

要完成答案,如果您有C / C ++背景:

  • 可变对象通常在堆上分配并具有稳定的内存地址。它们通过引用传递
  • 不可变对象在堆栈中并通过副本传递

此外,AFAIK,!的{​​{1}}只是一个引起注意的名称惯例,它与julia内部无关。您可以根据需要编写fun!

<强>示例:

fun

另见FAQ

参考{}示例:

Isaiah Norton发表评论

v=ones(3);                         # [1 1 1]
isimmutable(v)                     # false -> v is passed by reference
foo(v::Array{Float64}) = v .*= 2;  # hence v can be modified
foo(v); 
v                                  # [2 2 2]

v=Int(1)                           # 1
isimmutable(v)                     # true -> v is passed by copy
foo(v::Int) = v *= 2               # use a local copy of v
foo(v)                             # returns 2, but it is a local copy
v                                  # 1 (unmodified because we worked with a copy)