Julia中关联字典的问题



我有一个关于在字典中设置值的问题。我不明白为什么它们会在一个循环中被无意地改变。这里,x_exog["B_l_pre"][2]从0.5更改为0.525,但我只指定x_exog["B_l_post"][2]进行更改。为什么?

## 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]
x_exog["B_l_post"] = x_exog["B_l_pre"]
x_exog["B_h_post"] = x_exog["B_h_pre"]

x_exog_baseline = x_exog
# define the parameters
shock = "amenity"
for run in ["baseline","pro_poor_program", "pro_rich_program" ]

# set the initial values for exogenous variables
local x_exog = 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
print(x_exog["B_l_pre"][2], x_exog["B_h_pre"][2]) ###Why the loop has changed x_exog["B_l_pre"] and x_exog["B_h_pre"] ?????
end

Julia使用共享传递(参见这个问题如何在Julia中通过引用和值传递对象?)

基本上,对于基本类型,赋值操作符赋值,而对于复杂类型,赋值操作符赋引用。结果x_exog["B_l_post"]x_exog["B_l_pre"]都指向相同的内存位置(===根据内存中的地址比较可变对象):
julia> x_exog["B_l_post"] === x_exog["B_l_pre"]
true

你需要做的是创建一个对象的副本:

x_exog["B_l_post"] = deepcopy(x_exog["B_l_pre"])

现在它们是两个独立的对象,只是具有相同的值:

julia> x_exog["B_l_post"] === x_exog["B_l_pre"]
false
julia> x_exog["B_l_post"] == x_exog["B_l_pre"]
true

因此在你的情况下

就是这么简单。因为你说:

x_exog["B_l_post"] = x_exog["B_l_pre"]

并且记住您将x_exog["B_l_pre"]指定为:

x_exog["B_l_pre"] = [1;0.5;2]

所以x_exog["B_l_post"]x_exog["B_l_pre"]在内存中指向同一个对象。为了避免这种情况,您可以将x_exog["B_l_pre"]的副本传递给x_exog["B_l_post"]:

julia> x_exog["B_l_post"] = copy(x_exog["B_l_pre"])
3-element Vector{Float64}:
1.0
0.5
2.0
julia> x_exog["B_l_post"][2] = 2
2
julia> x_exog["B_l_post"]
3-element Vector{Float64}:
1.0
2.0
2.0
julia> x_exog["B_l_pre"]
3-element Vector{Float64}:
1.0
0.5
2.0

你可以看到,我把x_exog["B_l_post"]的第二个元素改成了2,但是这个改变不会发生在x_exog["B_l_pre"]中,因为它们现在是两个分开的对象。

相关内容

  • 没有找到相关文章

最新更新