Проблема не в том, что аргументы передаются в качестве значений.В Python аргументы передаются по ссылке, поэтому start.heater.ingredients_list[1]["ingredient"]
равно start.sauce
.
Фактическая проблема заключается в предположении, что item['ingredient'].set('caramel')
изменяет значение start.sauce
.Это не так, это установка start.heater.ingredients_list[1]["ingredient"]
по адресу строки "caramel"
.
Короче говоря, вы делаете это
a = "sugarAndWater" # Put "sugarAndWater" in memory and assign its address to a
b = a # Assign a to b, so b is the address of "sugarAndWater"
b = "caramel" # Put "caramel" in memory and assign its address to b, don't alter a
Классическая конструкция, чтобы избежать этогосделать
a = ["sugarAndWater"]
b = a
b[0] = "sauce"
, что немного многословно, но помните, что у функций должно быть как можно меньше побочных эффектов.
Это объяснение уже есть в Интернете, в большой статье, котораяговорил о «коробках» и был намного более вдохновлен чем это.Если кто-то вспомнит, где это было ...
Редактировать: Вот оно , в Код, похожий на Pythonista