Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
174 views
in Technique[技术] by (71.8m points)

DolphinDB中字典可以append!吗

下面代码中info_dict是一个字典,key是股票代码,value是一个向量。

def cal_fac_fun2(mutable info_dict, fout, s){
    code = s[1]
    if((code in keys(info_dict)) == false){
        return NULL
    }
    fout.writeLine(code)
    v1 = info_dict[code]
    fout.writeLine(code)
    
    info_dict[code].append!(v1[v1.size()-1]+s[12])
    
    try{
      v = info_dict[code]
      fac = (v[v.size()-121] - v[v.size()-241])/(v[v.size()-1] - v[v.size()-241])
    }
    catch(ex){
      return NULL
    }
    fout.writeLine(fac)
    return fac
}

我在DolphinDB database GUI中执行上面代码报错:
Read only object or object without ownership can't be applied to mutable function append!

info_dict[code].append!(v1[v1.size()-1]+s[12])这里不允许append!()。 这个问题怎么解决?向量不能使用append!,怎样才能修改它呢?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

问题中提到字典的值是一个向量(数组),也就意味着字典的值是ANY类型,元组(tuple)的元素也是ANY类型。对于tuple和值类型为ANY的字典,存储的对象一般情况下是不能修改的。原因是ANY类型是一个对象,我们在完全或部分复制一个tuple或字典,或者访问他们的元素是,得到的是一个引用,而不是拷贝。也就是用的是shallow copy而不是deep copy,如果允许修改这些元素对象,在复杂的代码中极易造成代码质量问题,以及多线程并发读写的问题。

现在如果要修改ANY类型字典中存储的元素对象,有两个例外:

(1)使用dictUpdate!函数进行修改。(必须是DolphinDB 1.10.11以及以后的版本)

info_dict[code].append!(v1[v1.size()-1]+s[12])

修改后的代码

dictUpdate!(info_dict, append!, code, v1[v1.size()-1]+s[12])

(2)如果元素对象是一个内存表,可以直接使用tableInsert函数进行修改。但是开发人员必须确保不存在多线程的问题。如果有多个线程并发读写这个内存表,必须确保这个内存表是共享的。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...