我在迭代 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 次迭代(尽管字典的长度为 3)。但是,可以通过将 key 深度复制到新对象中来解决“奇怪”的行为。
行为是否符合预期?
提前致谢!
(顺便说一句。我正在使用 Julia 版本 0.4.6(2016-06-19 17:16 UTC))
最佳答案
这是意料之中的:你不能在改变字典的同时安全地迭代它。这也是其他语言中的常见限制:其中一些会阻止您这样做;其他人允许它但表现出类似的行为。
关于dictionary - Julia,在遍历字典时更改键时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853198/