【发布时间】:2019-01-15 15:21:33
【问题描述】:
我的脚本正在覆盖与键/尚未调用的键关联的值。
我有一个嵌套字典,其中包含以下键的层次结构:
dict["species"]["type"]["reaction"]
这是另一个具有相同结构的字典(比如说 dict_0)的副本。副本将不断更新,原件保持不变以供参考。
反应的值以从原始 dict_0 复制的 ["e", "e", "p"] 等小列表开始,列出了物种参与的反应的左侧。
例如:
dict_0["e"]["destruction"]["r_1"] = ["e", "e", "p"]
dict_0["p"]["destruction"]["r_1"] = ["e", "e", "p"]
因为e和p都参与了反应r_1,这是一个导致e和p净损失的过程。
dict["e"]["destruction"]["r_1"]
最初与 dict_0 中的相同,但列表中的值会使用表示该物种密度的浮点数进行更新,该浮点数是从另一个名为 densities 的字典中提取的,它只是 [species: density] 作为键、值。
当我在物种键的循环中循环反应键时出现问题(将“类型”键设置为“破坏”,因为这需要首先发生)。我检查反应键是否在批准的反应标识符列表中,然后尝试仅将 dict{} 字典中该反应的值更改为密度字典提供的密度。这是通过使用相同的键来引用原始字典 dict_0{} 来完成的dict{} 中的密度。这样您总能找到正确的密钥。
问题本身是当我覆盖最初复制的 ["e", "e", "p"] 到 [density_e, density_e, density_p] 包含在 dict["e"]["destruction"][reaction (例如 "r_1")],它还覆盖了 dict["p"]["destruction"][reaction(e.g. "r_1")]
的等效值我已经输入了大量的打印语句来试图找出问题,但无法理解发生了什么。我在控制台(非嵌套)中尝试了一个简化版本,它的行为符合预期 - 我认为它可能混淆了相同的值。我还可以手动更改 dict["e"]["destruction"][reaction(e.g. "r_1")] 中的值,并且等效的 ['p'] 值现在不会更改。
下面的代码不是全部,但它是问题出现在所有打印语句的末尾附近的某个地方。
def dn_keys(diff_input,species_list,rates_names,densities_dict):
diff_input_new=copy.deepcopy(diff_input)
# Creates a new array from the master array and replaces the string values
# with floats using the dictionaries.
# print(diff_input_new)
# a = input("press to continue to density and rate population")
for species, value in diff_input_new.items():
# for each species set of reactions:
print("#####################")
print("species = " + str(species))
print("#####################")
# a = input("press return to continue")
# iterate over destructive processes first
# key2 = "destruction"
print("Destruction processes")
print(str(diff_input_new[species]["destruction"]))
for reaction, value in diff_input_new[species]["destruction"].items():
if reaction in rates_names:
print("Reaction found: " + str(reaction) +" for species: " + str(species))
print("original entry: " + str(diff_input_new[species]["destruction"][reaction]))
print(diff_input_new["e"]["destruction"][reaction])
print(diff_input_new["p"]["destruction"][reaction])
# for each species in the reaction:
# print("array length = " + str(len(diff_input[species]["destruction"][reaction])))
for i in range(len(diff_input[species]["destruction"][reaction])):
# print(species)
# if the rate hasn't been previously been added
# find the densities and replace the dictionary entries appropriately
print(i)
print("densities found for " + str(diff_input[species]["destruction"][reaction][i]) + ":")
print(densities_dict[diff_input[species]["destruction"][reaction][i]])
print("--------")
print(diff_input[species]["destruction"][reaction][i])
print("in:")
print(densities_dict.keys())
print("---")
print(diff_input_new[species]["destruction"][reaction][i])
print("of")
print(diff_input_new[species]["destruction"][reaction])
diff_input_new[species]["destruction"][reaction][i] = densities_dict[diff_input[species]["destruction"][reaction][i]]
print("converted to:")
print(diff_input_new[species]["destruction"][reaction][i])
print("---------------")
diff_input_new["e"]["destruction"][reaction] = [1,1,1]
print(diff_input_new["e"]["destruction"][reaction])
print(diff_input_new["p"]["destruction"][reaction])
预期结果: dict["e"]["destruction"][reaction] 的更新独立于 dict["p"]["destruction"][reaction]
实际结果: 两者一起更新。
感谢您的宝贵时间
【问题讨论】:
-
如何复制?要拥有 2 个独立副本,您需要使用 copy.deepcopy 进行复制。
-
另外请发布正确的 MCVE (stackoverflow.com/help/mcve)。这样做 FWIW 时,您可能会自己发现问题。
-
谢谢,我将首先对这些资源进行另一次挖掘,如有必要,可能会重新格式化我的问题。发布后我删除了很多不必要的批量。
标签: python python-3.x dictionary modeling