Изменяет ли изменение глобальной переменной в рекурсивной функции верхний уровень

#python #python-3.x #flask #global-variables

#python #python-3.x #flask #глобальные переменные

Вопрос:

У меня есть глобальная словарная переменная, и я пытаюсь вызвать рекурсивную функцию, которая опускается на несколько уровней в зависимости от того, какой ключ она пытается найти, а затем изменяет это значение.

Мне интересно, почему это не изменяет глобальную переменную, когда я меняю ее ветвь в своей функции.

Итак, моя рекурсивная функция выглядит следующим образом:

 def update_dict_with_edits(base_system_dict, changed_json_dict):
    name = changed_json_dict["base_system"]["name"]
    if "base_system" not in base_system_dict:
        return
    sub_dict = base_system_dict["base_system"]
    if name == sub_dict["name"]:
        print(name)
        print("found it and updating")
        sub_dict = changed_json_dict
        # even if I print out here the_global_dict_object it is unaltered
        # print(the_global_dict_object)
        return
    if "sub_systems" not in sub_dict:
        return
    for d in sub_dict["sub_systems"]:
        update_dict_with_edits(d, changed_json_dict)
  

И я называю это здесь:

 @app.route('/test', methods=['GET', 'POST'])
def test():
    if request.method == 'POST':
        the_json = request.form.get('json_data', None)
        the_json = json.loads(the_json)
        update_dict_with_edits(the_global_dict_object, the_json)
        # here when I print out the_global_dict_object it is unaltered
        # print(the_global_dict_object)
        # but here when I render the variable the_json just to view it,
        # it is correctly edited but the change just doesn't happen in
        # the function
        return render_template('testing.html', the_json=the_json)
  

Я использую flask, но я не думаю, что это все так важно.

Комментарии:

1. Вы ничего не присваиваете словарям. Ни один словарь не мутирует нигде в вашем коде .

2. Но, вообще говоря, если вы передаете словарь, затем мутируете этот словарь (добавляете пары ключ-значение, изменяете значения, удаляете ключи), то это изменение видно для любых других ссылок на тот же словарь.

3. Извините, я должен был выразиться более ясно, но я подумал, что имена переменных говорят сами за себя, и я не хотел вдаваться в подробности. Там, где я вызываю функцию, переменная «the_json» является измененным словарем, это подраздел всего словаря, который я извлек и изменил, и теперь я пытаюсь назначить этот измененный раздел обратно основному.

4. Итак, base_system_dict — это все, а changed_json_dict — это подраздел, который я удалил, пользователь изменил в графическом интерфейсе, и теперь я добавляю его обратно.

5. Но вы ничего не присваиваете никаким ключам base_system_dict нигде.

Ответ №1:

Вы меняете имя, а не изменяете ссылку:

 # Assign a dict to the name `sub_dict`
sub_dict = base_system_dict["base_system"]
if name == sub_dict["name"]:
    # Update *that name* to point at a new dictionary
    sub_dict = changed_json_dict
  

Вместо этого обновите ссылку в base_system_dict :

 if name == sub_dict["name"]:
    # Update *the reference* to point at a new dictionary
    base_system_dict["base_system"] = changed_json_dict
  

Комментарии:

1. Хорошо, это и комментарий Мартджина решили проблему. Спасибо за помощь и материалы для чтения.