julia函数中:按引用还是按值传递?
在julia中,我们如何知道类型是由值还是由引用操纵的 以java为例(至少对于sdk):julia函数中:按引用还是按值传递?,julia,Julia,在julia中,我们如何知道类型是由值还是由引用操纵的 以java为例(至少对于sdk): 基本类型(名称以小写字母开头的类型,如“int”)由值操纵 对象(名称以大写字母开头的对象,如“HashMap”)和数组通过引用进行操作 因此,很容易知道在函数内部修改的类型会发生什么情况 我很确定我的问题是重复的,但我找不到重复的 编辑 此代码: function modifyArray(a::Array{ASCIIString,1}) push!(a, "chocolate") end
- 基本类型(名称以小写字母开头的类型,如“int”)由值操纵
- 对象(名称以大写字母开头的对象,如“HashMap”)和数组通过引用进行操作
function modifyArray(a::Array{ASCIIString,1})
push!(a, "chocolate")
end
function modifyInt(i::Int)
i += 7
end
myarray = ["alice", "bob"]
modifyArray(myarray)
@show myarray
myint = 1
modifyInt(myint)
@show myint
返回:
myarray = ASCIIString["alice","bob", "chocolate"]
myint = 1
这让我有点困惑,以及我提出这个问题的原因。@StefanKarpinski的评论澄清了这个问题
我的困惑源于这样一个事实:我将+=视为一个操作符,一个类似push的方法!它正在修改对象本身。但事实并非如此
i+=7
应被视为i=i+7
(与不同对象的绑定)。实际上,如果我使用例如a=[“chocolate”]
中的相应术语,那么modifyArray的这种行为将与相同
- 不可变对象(无论是
bitstype
s,如Int
,还是用immutable
声明的复合类型,如Complex
)在创建后都无法修改,因此通过复制传递
- 可变对象(数组或用
type
声明的复合类型)通过引用传递,因此可以通过调用函数进行修改。按照惯例,这些函数以感叹号结尾(例如,sort!
),但这种语言并不强制执行
但是请注意,不可变对象可以包含可变对象,该对象仍然可以由函数修改
这是。我认为最严格的答案是
严格地说,Julia不是“通过引用调用”,而是“通过值调用,其中值是
“引用”,或“通过共享调用”,如
python、java、ruby
然而,关键的事实是,所有的值都是通过引用操作的。另请参见:,。@StefanKarpinski谢谢,这一点很清楚。我刚才把自己搞糊涂了。。。我已经编辑了我的问题,以防其他人也陷入同样的困境,只是指出“不可变对象[…]通过复制传递”的语句仅适用于isbits
类型。e、 g.a=“你好”;f(x)=指针(x);指针(a)==f(a)#true,通过引用传递
。只是它们是不可变的,所以在一个函数中你不能对它们做很多事情。但是如果你真的想改变它,你可以通过不安全的指针等来改变它,所以区别很重要。另外,某些不可变的对象是通过复制来传递的,这是一个实现细节。从用户的角度来看,所有参数都是通过共享传递的。