dictionary - Julia,在遍历字典时更改键时的奇怪行为

标签 dictionary iterator julia

我在迭代 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/

相关文章:

python - 如何修复 Python 3 中字典处理的顺序?

asp.net-mvc - ASP.NET MVC 3 中 Dictionary<string, string> 的隐藏输入

java - Hadoop Iterator 在第一次迭代时跳过方法调用

c++ - 如何获得保证无效的迭代器(对于 vector )?

julia - 需要很长时间的基准测试功能

function - Julia :怎么了!拉格朗日多项式函数

dictionary - Hash 可以按键或值排序吗?

python - 如何使用字典转换列表中的值

c++ - 插入器迭代器,可根据谓词插入不同的容器

julia - 是否可以从抽象类型 julia 以外的东西继承?