【发布时间】:2026-02-11 09:15:02
【问题描述】:
在遍历 Julia 字典并在迭代期间更改键名时,我遇到了(在我看来)奇怪的行为。 以下示例按预期工作:
a = Dict("klaus_one" => 3,
"bernd_one" => 5,
"gabi_one" => 8)
for i= keys(a)
x = pop!(a,i)
a[join([i,"new"],"_")] = x + 3
end
返回(如预期)
# Dict{ASCIIString,Int64} with 3 entries:
# "gabi_one_new" => 11
# "bernd_one_new" => 8
# "klaus_one_new" => 6
但是:
a = Dict("klaus_one" => 3,
"bernd_one" => 5,
"gabi_one" => 8)
for i=1:5
if i!=1
# _keys = deepcopy(keys(a))
_keys = keys(a)
for k = _keys
k_base = join(split(k,"_")[1:2],"_")
a[k_base] = pop!(a,k) + 3
end
end
# _keys = deepcopy(keys(a))
_keys = keys(a)
for k = _keys
k_new = join([k,"new2"],"_")
a[k_new] = pop!(a,k)
end
end
结果:
# Dict{ASCIIString,Int64} with 3 entries:
# "klaus_one_new2" => 27
# "gabi_one_new2" => 32
# "bernd_one_new2_new2" => 17
正如值和键“bernd_one_new2_new2”所示,发生了超过三个迭代(尽管字典的长度为 3)。然而,“奇怪”的行为可以通过将键深度复制到新对象中来解决。
行为是否符合预期?
提前致谢!
(顺便说一句。我使用的是 Julia 版本 0.4.6(2016-06-19 17:16 UTC))
【问题讨论】:
标签: dictionary iterator julia