我是 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
但是当在数组上做类似的事情时,它充当一个变异函数(在全局范围内修改它的参数!)
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
我意识到我可以通过将第一行更改为来解决此问题y = copy(x)
,但是这种(危险的?)行为的原因到底是什么?
我会对此写一个答案,但我认为约翰·迈尔斯·怀特已经比我做得更好了,所以我将链接到他的博文:
https://www.juliabloggers.com/values-vs-bindings-the-map-is-not-the-territory-3/ https://www.juliabloggers.com/values-vs-bindings-the-map-is-not-the-territory-3/
简而言之x = 1
and x[1] = 1
是非常不同的操作。第一个是作业,即更改变量的绑定x
——而第二个是一个语法糖,用于调用setindex!
函数,在数组的情况下,分配给数组中的一个位置。赋值只会改变哪些变量引用哪些对象,而不会修改任何对象。变异仅修改对象,而不会改变哪些变量引用哪些对象。这个答案对区别有更多细节:在 Julia 中使用 = 运算符创建副本 https://stackoverflow.com/questions/33002572/creating-copies-in-julia-with-operator/33003055#33003055.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)