当我创建一些数组A并将其分配给B时
A = [1:10]
B = A
Run Code Online (Sandbox Code Playgroud)
我可以修改A,更改反映在B中
A[1] = 42
# B[1] is now 42
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用标量变量执行此操作,则更改不会传播:
a = 1
b = a
a = 2
# b remains being 1
Run Code Online (Sandbox Code Playgroud)
我甚至可以将事物混合起来并将矢量转换为标量,并且变化不会传播:
A = [1:10]
B = A
A = 0
# B remains being 1,2,...,10
Run Code Online (Sandbox Code Playgroud)
=运营商究竟做了什么?当我要复制的变量和修改旧的保存新变量的完整性,当我应该使用b = copy(a)经过短短b=a?
在julia中,我们如何知道某个类型是通过值还是通过引用来操纵的?
以java为例(至少对于sdk):
基本类型(名称以小写字母开头的类型,如"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
Run Code Online (Sandbox Code Playgroud)
回报:
myarray = ASCIIString["alice","bob", "chocolate"]
myint = 1
Run Code Online (Sandbox Code Playgroud)
这对我来说有点混乱,我之所以提交这个问题.@StefanKarpinski的评论澄清了这个问题.
我的困惑来自于我认为+ =作为操作员,像推的方法!这是修改对象本身.但事实并非如此.
i += 7应该被视为i = i + 7(与不同对象的绑定).实际上,modifyArray如果我使用例如,这种行为将是相同的a = ["chocolate"].
julia ×2