繁体   English   中英

朱莉娅:在函数中更新Float64

[英]Julia: Updating a Float64 within a function

我正在尝试创建一个函数来更新Float64参数。 下面的示例应该能够阐明我要实现的目标。

a=1.2

function fun!(a)
   a=3.4;
end

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

你做不到 一个Float64不是可变值,所以你不能发生变异的价值a 您只能用单独的Float64替换a 这就是一个不变的值。

更低的级别(尽管有例外,通常也是如此): Float64由它们的实际字节表示,而可变变量是指向实际字节的指针。 可变变量的实际值是它的指针。 突变意味着更改指针所指向的内存位置处的值,但是对于不可变对象而言,这并不存在。

要完成答案,并且您具有C / C ++背景:

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

另外,AFAIK , ! fun! 只是一个引起人们注意的名称惯例,与julia内部无关。 您可以写fun的东西。

例子:

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)

另请参阅常见问题解答

Ref {}示例:

以赛亚·诺顿(Isaiah Norton)评论

foo(r::Ref{Int}) = r[] *= 2

r=Ref{Int}(1)     # Base.RefValue{Int64}(1)
foo(r);
r                 # Base.RefValue{Int64}(2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM