我定义了一个函数,它接受一个数组作为参数,向其中附加一些值并返回附加的数组。 我看到我作为函数参数传递的数组被修改了,即使我的函数没有直接作用于它。
这是一个最小的代码
function test(t)
y = t
append!(y, [2])
return y
end
然后,定义一个数组x
x = [1]
当我调用 test(x) 时,它返回[1, 2],这是预期的,但 x 现在也有值 [1, 2],我不明白......
在 Julia 中,有一个约定,当函数改变参数时,将
!
添加到函数名称中,请参阅本节末尾 https://docs.julialang.org/en/v1/manual/functions/#man -参数传递.
然而,这只是一个约定(以视觉方式展示事物)。正如 https://docs.julialang.org/en/v1/manual/functions/#man-argument-passing 中所述,无论您如何命名该函数,都使用“pass-by-sharing”,这意味着
y
指向内存中与 x
相同的地址。
如果你想避免
x
的突变,你必须编写 y = copy(t)
来创建一个独立的对象;或 y = deepcopy(t)
如果您想确保全新的对象,包括复制 x
指向的潜在对象。