Menu
CoddyTech

Копирование словарей

Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 22 из 78.

Присваивание словаря другой переменной не копирует его. Обе переменные ссылаются на один и тот же словарь, поэтому изменение через одну переменную отображается и через другую:

var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10

duplicate() создаёт новый словарь с теми же парами. Изменение копии не затрагивает оригинал:

var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30

duplicate() создаёт поверхностную копию: у копии есть собственные пары, но значение, представляющее собой массив или словарь, по-прежнему является общим для обеих копий:

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) копирует двумерный массив вместе с его строками.

challenge icon

Задание

Легко

Создайте волну врагов на основе шаблона. Дан словарь template. Программа считывает два целых числа, по одному в строке: сколько врагов нужно создать (n) и бонус к hp.

Для каждого номера врага i от 1 до n:

  1. Создайте копию template, полностью независимую от него.
  2. Добавьте ключ "id" со значением i.
  3. Прибавьте bonus * i к значению "hp" внутри "stats".
  4. Если это последний враг, добавьте "crown" в его "loot".
  5. Выведите врага.

Наконец, выведите 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript