朱莉娅语言:修改对象

时间:2014-03-13 22:43:05

标签: julia

我有以下代码:

function generateinputdistributions! (jointA, jointB)
    rand! (jointA)
    rand! (jointB)
    println (sum (jointB))
    jointA *= (1.0/sum (jointA))
    jointB *= (1.0/sum (jointB))
    println (sum(jointB))
end

我有几行代码在另一个文件中调用它:

generateinputdistributions! (jointA, jointB)
println (sum (jointB))

其中jointA和jointB已预先分配。我期望第三个print语句应该给出1的答案(第二个答案)。但是,它没有,而是给出第一个print语句的值。因此,看起来jointA * =(1.0 / sum(jointA))中的jointA是一个被破坏的本地对象。有人可以解释究竟发生了什么吗?

我想要做的是修改jointA和jointB(出于性能原因)。兰特!似乎正确地完成了它的工作。我不明白* =的这种行为。

1 个答案:

答案 0 :(得分:1)

jointA *= (1.0/sum (jointA))将导致包含新对象的jointA变量使旧的jointA保持不变。原因是乘法不会修改它的操作数。 *=与说= *(...)相同。在该行之后,jointA包含与行之前不同的对象。新对象的作用域是函数,因为它在那里被分配并且从未返回,所以julia在函数退出后可以自由地使用它。