我经历了(在我看来)奇怪的行为,同时迭代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 Version 0.4.6(2016-06-19 17:16 UTC))
答案 0 :(得分:6)
这是预期的:你不能安全地迭代字典,同时改变字典。这也是其他语言的常见限制:其中一些禁止你这样做;其他人允许但表现出类似的行为。