Почему python может переопределять значения, связанные с ключом словаря, который не был вызван? - PullRequest
0 голосов
/ 15 января 2019

Мой скрипт переопределяет значения, связанные с ключами / ключом, который не был вызван.

У меня есть вложенный словарь, содержащий иерархию ключей, например:

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"] ["уничтожение"] [реакция]

фактический результат: оба обновляются вместе.

Спасибо за ваше время

1 Ответ

0 голосов
/ 15 января 2019

Проблема была точно такой же, как подчеркивали bruno desthuillers, которая углубилась из-за базового понимания отношений имя-значение в python.

В начале кода все записи словарных реакций объявляются как имена для одного значения - списка под названием видов_lhs, поэтому, когда я изменил один экземпляр, он изменил их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...