当我创建一些数组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 的新手,到目前为止我是它的粉丝。但是从多年的 R 编程经验来看,一些范围规则让我感到困惑。
让我们来看看这个函数。这完全符合我的预期。
function foo1(x)
y = x
t = 1
while t < 1000
t += 1
y += 1
end
return 42
end
var = 0;
foo1(var)
# 42
var
# 0
Run Code Online (Sandbox Code Playgroud)
但是当对数组做类似的事情时,它充当一个变异函数(在全局范围内修改它的参数!)
function foo2(x)
y = x
t = 1
while t < 1000
t += 1
y[1] += 1
end
return 42
end
var = zeros(1);
foo2(var)
# 42
var
# 999.0
Run Code Online (Sandbox Code Playgroud)
我意识到我可以通过将第一行更改为 来解决这个问题y = copy(x),但是首先出现这种(危险的?)行为的原因是什么?