Копирование словарей
Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 22 из 78.
Присваивание словаря другой переменной не копирует его. Обе переменные ссылаются на один и тот же словарь, поэтому изменение через одну переменную отображается и через другую:
var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10duplicate() создаёт новый словарь с теми же парами. Изменение копии не затрагивает оригинал:
var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30duplicate() создаёт поверхностную копию: у копии есть собственные пары, но значение, представляющее собой массив или словарь, по-прежнему является общим для обеих копий:
var hero := {"stats": {"hp": 100}, "items": ["sword"]}
var clone := hero.duplicate()
clone["stats"]["hp"] = 1
clone["items"].append("shield")
print(hero){ "stats": { "hp": 1 }, "items": ["sword", "shield"] }Передай true, чтобы создать глубокую копию: duplicate(true) также копирует все вложенные массивы и словари, поэтому у двух копий нет общих данных:
var twin := hero.duplicate(true)
twin["stats"]["hp"] = 50
print(hero["stats"]["hp"]) # 1Поверхностной копии достаточно, когда каждое значение — число, строка или логическое значение. Как только значение становится массивом или словарём, используй duplicate(true). С массивами всё работает так же: grid.duplicate(true) копирует двумерный массив вместе с его строками.
Задание
ЛегкоСоздайте волну врагов на основе шаблона. Дан словарь template. Программа считывает два целых числа, по одному в строке: сколько врагов нужно создать (n) и бонус к hp.
Для каждого номера врага i от 1 до n:
- Создайте копию
template, полностью независимую от него. - Добавьте ключ
"id"со значениемi. - Прибавьте
bonus * iк значению"hp"внутри"stats". - Если это последний враг, добавьте
"crown"в его"loot". - Выведите врага.
Наконец, выведите Template: , а затем шаблон, который должен остаться неизменным. Для входных данных 2 и 10 вывод будет таким:
{ "type": "slime", "stats": { "hp": 40, "speed": 2 }, "loot": ["gel"], "id": 1 }
{ "type": "slime", "stats": { "hp": 50, "speed": 2 }, "loot": ["gel", "crown"], "id": 2 }
Template: { "type": "slime", "stats": { "hp": 30, "speed": 2 }, "loot": ["gel"] }Попробуйте сами
extends Node
func _ready():
var template := {"type": "slime", "stats": {"hp": 30, "speed": 2}, "loot": ["gel"]}
var n := int(OS.read_string_from_stdin())
var bonus := int(OS.read_string_from_stdin())
# Создайте и выведите n врагов
# Выведите шаблон
pass
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки: углублённое изучение
Методы строкПоиск в строкахЗамена и обрезка пробеловРазделение и объединениеПовторение — проверка имени пользователя4Словари. Часть 2
Вложенные словариМассивы словарейОбъединение словарейКопирование словарейПовторение — подсчёт частоты10Продвинутые функции
Возврат нескольких значенийЛямбда-функции. Часть 1Лямбда-функции. Часть 2Повторение — сортировка с помощью лямбда-функцииРекурсивные функции. Часть 1Рекурсивные функции. Часть 2Повторение — сумма вложенного массива13Система управления запасами
Обзор проектаДобавление товара2Продвинутое управление ветвлением
Сопоставление с переменнымиУсловия в шаблонахШаблоны массивовШаблоны словарейПроверка принадлежностиИтоги — парсер команд5Приложение «Телефонная книга»
Показать менюДобавить контакт8Менеджер успеваемости студентов
Обзор проектаДобавить студента3Многомерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваВложенные циклы с двумерными массивамиПовторение: двумерные массивыРваные массивыТипичные шаблоны работы с двумерными массивамиПовторение: игровое поле6Множества и словари
Что такое множество?Словарь как множествоДобавление и удалениеОбъединение и пересечениеРазность множествПовторение — удаление дубликатовПотренируйтесь самостоятельно: Онлайн-компилятор GDScript