Julia中字典内关联数组意外变更问题咨询
问题原因与解决方法:Julia字典中意外修改未指定数组的问题
核心问题根源
你的问题本质是Julia中引用类型的赋值特性导致的:
- 数组是引用类型:当你执行
x_exog["B_l_post"] = x_exog["B_l_pre"]时,并没有创建新的数组,只是让B_l_post和B_l_pre两个键指向内存中同一个数组对象。所以修改B_l_post的元素时,B_l_pre的对应元素也会跟着变——因为它们本来就是同一个东西。 - 字典也是引用类型:
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
相关产品推荐
相关产品推荐

