我有以下代码:
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(出于性能原因)。兰特!似乎正确地完成了它的工作。我不明白* =的这种行为。
答案 0 :(得分:1)
jointA *= (1.0/sum (jointA))
将导致包含新对象的jointA变量使旧的jointA保持不变。原因是乘法不会修改它的操作数。 *=
与说= *(...)
相同。在该行之后,jointA包含与行之前不同的对象。新对象的作用域是函数,因为它在那里被分配并且从未返回,所以julia在函数退出后可以自由地使用它。