#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. Хорошо, это и комментарий Мартджина решили проблему. Спасибо за помощь и материалы для чтения.