Menu
CoddyTech

复制字典

本课属于 Coddy GDScript 学习旅程的“逻辑与流程”单元。第 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 加成。

对于从 1 到 n 的每个敌人编号 i:

  1. 复制一份 template,使副本与原模板完全独立。
  2. 添加键 "id",值为 i。
  3. 将 bonus * i 加到 "stats" 中的 "hp"。
  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 个敌人

	# 输出 template
	pass
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: GDScript 在线编译器