Statistics.jl中mean!同对象传参返回错误是否属于正常行为?
结论
你的判断完全正确,该表现属于符合设计预期的正常行为,不是mean!函数的bug。
原因说明
- Julia生态中所有名称以
!结尾的函数都属于原地修改函数,统一遵循的约定是:函数会直接修改第一个入参的内容,且默认不会处理多个入参互为内存别名的场景。 - 从
mean!的实现逻辑来看,它会先将目标数组r初始化清零,再遍历源数组v的元素做累加求均值写入r。当r和v指向同一个数组对象时,初始化清零的操作会直接把后续需要读取的源数据全部擦除,最终自然只能得到全0的非预期结果。 - 不止
mean!,你观察到的sum!有相同表现是完全符合逻辑的,几乎所有Julia原生及第三方包的原地修改函数都遵循相同的设计规则,官方也明确要求开发者如果不能确认入参是否存在别名关系,需要自行调用copy等方法复制源数据后再传入,你测试中使用mean!(copy(a), a)的写法就是符合约定的正确用法。
内容的提问来源于stack exchange,提问作者Jose Manuel de Frutos
相关产品推荐
相关产品推荐

