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

Julia中字典内关联数组意外变更问题咨询

问题原因与解决方法:Julia字典中意外修改未指定数组的问题

核心问题根源

你的问题本质是Julia中引用类型的赋值特性导致的:

  1. 数组是引用类型:当你执行x_exog["B_l_post"] = x_exog["B_l_pre"]时,并没有创建新的数组,只是让B_l_post和B_l_pre两个键指向内存中同一个数组对象。所以修改B_l_post的元素时,B_l_pre的对应元素也会跟着变——因为它们本来就是同一个东西。
  2. 字典也是引用类型:x_exog_baseline = x_exog只是复制了字典的引用,而非创建新字典。循环里每次local x_exog = x_exog_baseline都是指向同一个原始字典,导致每次循环的修改会累积叠加,进一步放大了引用带来的问题。

解决步骤

要彻底解决这个问题,需要在两个关键节点做复制操作:

  • 给数组创建独立副本,避免不同键指向同一数组;
  • 每次循环都创建基准字典的深度副本,保证每次循环的修改互不干扰。

修正后的完整代码

## Parameters and set up the environment
# Set exogenous parameters
x_exog = Dict{String, Any}()

# set amenity
x_exog["B_l_pre"] = [1;0.5;2]
x_exog["B_h_pre"] = [1;0.5;2]
# 创建数组副本,让B_l_post和B_l_pre指向独立数组
x_exog["B_l_post"] = copy(x_exog["B_l_pre"])
x_exog["B_h_post"] = copy(x_exog["B_h_pre"])

# 深度复制字典,保存干净的基准状态
x_exog_baseline = deepcopy(x_exog)
# define the parameters
shock = "amenity"

for run in ["baseline","pro_poor_program", "pro_rich_program" ]
    
    # 每次循环都生成基准字典的深度副本,避免修改原基准数据
    local x_exog = deepcopy(x_exog_baseline)
    x_exog["run"] = run
    x_exog["shock"] = shock

    # define the policy shock
    if shock == "amenity"
        # improve amenity slum
        
        if run == "pro_poor_program"
            x_exog["B_l_post"][2] = x_exog["B_l_post"][2] * 1.05

        elseif run == "pro_rich_program"
            x_exog["B_h_post"][2] = x_exog["B_h_post"][2] * 1.05

        else            
            x_exog["B_l_post"][2] = x_exog["B_l_post"][2] * 1.05
            x_exog["B_h_post"][2] = x_exog["B_h_post"][2] * 1.05
        end
        
    end
    println("Run: ", run, " | B_l_pre[2]: ", x_exog["B_l_pre"][2], " | B_h_pre[2]: ", x_exog["B_h_pre"][2])
end

修正效果

修改后,每次循环中B_l_pre和B_h_pre会始终保持初始值0.5,不会被意外修改;而B_l_post或B_h_post的修改只会作用于当前循环的字典副本,不会影响基准数据或其他循环的实例。

内容的提问来源于stack exchange,提问作者Pol Cosentino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:15:32