Julia中fill!填充数组数组引发引用共享问题,求替代方案
关于Julia中
fill!填充数组引用的问题及解决方案 问题重现
你的代码及执行结果如下:
原代码:
a = [[], [], []] # a is an array of array #### there is some code that modified a, then I want to clear array a #### fill!(a, []) # set every element of a back to an empty array push!(a[1], 1) # modify one of the element println(a)
执行输出:
[[1], [1], [1]]
这是不是Julia的bug?
这不是Julia的bug,而是fill!函数的设计逻辑:fill!(dest, x)的作用是将同一个对象的引用赋值给目标数组dest的每一个位置。你调用fill!(a, [])时,[]是一个单独的空数组实例,因此a的三个元素最终都指向这个共享的数组对象。当你对a[1]执行push!操作时,本质是修改了这个唯一的共享数组,所以所有元素都会同步显示变化。
替代解决方案
要让a的每个元素都是独立的空数组,可以用以下几种方式:
循环逐个创建新数组:
for idx in eachindex(a) a[idx] = [] end这种方式会为每个索引位置生成全新的空数组实例,彻底避免引用共享。
广播语法批量生成独立数组:
a .= [[] for _ in eachindex(a)]列表推导式会生成与
a长度一致的多个独立空数组,再通过广播赋值给a的每个元素。直接重新初始化数组:
如果不需要保留原数组的引用,直接重新创建数组是最简单的方式:a = [[], [], []]
内容的提问来源于stack exchange,提问作者creaple
相关产品推荐
相关产品推荐

