You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:40:54