Мой скрипт переопределяет значения, связанные с ключами / ключом, который не был вызван.
У меня есть вложенный словарь, содержащий иерархию ключей, например:
dict["species"]["type"]["reaction"]
Этокопия другого словаря (скажем, dict_0) с той же структурой.Копия будет постоянно обновляться, а оригинал останется неизменным для справки.
Значения реакций начинаются с небольших списков, таких как ["e", "e", "p"], скопированных из оригинала dict_0,перечисление левой стороны реакции, в которой участвует данный вид.
Например:
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, но значения в списке обновляются с помощью чисел с плавающей запятой, представляющих плотность этого вида, взятых из другого словаря, называемого плотностями, который просто [видов: плотность] в качестве ключа, значения.
Проблема возникает, когда я зацикливаюсь на ключе реакции внутри цикла на ключе вида (при установке ключа «тип» на «уничтожение», так как это должно произойти в первую очередь),Я проверяю, находится ли ключ реакции в списке утвержденных идентификаторов реакции, затем пытаюсь изменить значения этой реакции в словаре dict {} ТОЛЬКО на плотности, предоставляемые словарем плотностей.Это делается путем использования одних и тех же ключей для обращения к исходному словарю dict_0 {} каждый раз, когда всегда есть список ["e", "e", "p"], и последующего использования их в качестве ключей для словаря плотностей для обновленияплотности в dict {}.Таким образом, вы всегда можете найти правильные ключи.
Сама проблема заключается в том, что когда я переопределяю исходные скопированные ["e", "e", "p"] на [density_e, density_e, density_p], содержащиеся вdict ["e"] ["уничтожение"] [реакция (например, "r_1")], оно также переопределяет эквивалентные значения для dict ["p"] ["уничтожение"] [реакция (например, "r_1")]
Я приложил кучу печатных заявлений, чтобы попытаться найти проблему, но не могу понять, в чем дело.Я попробовал упрощенную версию в консоли (не вложенную), которая ведет себя как ожидалось - я подумал, что, возможно, это сбивает с толку идентичные значения.Я также могу изменить значения внутри dict ["e"] ["уничтожения"] [реакции (например, "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"] ["уничтожение"] [реакция] обновляется независимо от dict ["p"] ["уничтожение"] [реакция]
фактический результат: оба обновляются вместе.
Спасибо за ваше время