下面代码中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!,怎样才能修改它呢?
问题中提到字典的值是一个向量(数组),也就意味着字典的值是ANY类型,元组(tuple)的元素也是ANY类型。对于tuple和值类型为ANY的字典,存储的对象一般情况下是不能修改的。原因是ANY类型是一个对象,我们在完全或部分复制一个tuple或字典,或者访问他们的元素是,得到的是一个引用,而不是拷贝。也就是用的是shallow copy而不是deep copy,如果允许修改这些元素对象,在复杂的代码中极易造成代码质量问题,以及多线程并发读写的问题。
现在如果要修改ANY类型字典中存储的元素对象,有两个例外:
(1)使用dictUpdate!函数进行修改。(必须是DolphinDB 1.10.11以及以后的版本)
修改后的代码
(2)如果元素对象是一个内存表,可以直接使用tableInsert函数进行修改。但是开发人员必须确保不存在多线程的问题。如果有多个线程并发读写这个内存表,必须确保这个内存表是共享的。