我有一个关于在字典中设置值的问题。我不明白为什么它们会在一个循环中被无意地改变。这里,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"]
中,因为它们现在是两个分开的对象。