Sao chép từ điển
Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 22 trên 78.
Gán một từ điển cho một biến khác không tạo ra bản sao. Cả hai biến đều tham chiếu đến cùng một từ điển, vì vậy thay đổi qua biến này cũng hiển thị qua biến kia:
var template := {"type": "slime", "hp": 30}
var enemy := template
enemy["hp"] = 10
print(template["hp"]) # 10duplicate() tạo một từ điển mới có cùng các cặp khóa và giá trị. Thay đổi bản sao không làm ảnh hưởng đến bản gốc:
var original := {"type": "slime", "hp": 30}
var copy := original.duplicate()
copy["hp"] = 99
print(original["hp"]) # 30duplicate() tạo một bản sao nông: bản sao có các cặp khóa và giá trị riêng, nhưng giá trị là mảng hoặc từ điển vẫn được chia sẻ giữa hai bản:
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"] }Truyền true để tạo bản sao sâu: duplicate(true) cũng sao chép mọi mảng và từ điển bên trong, nên hai bản không chia sẻ dữ liệu nào:
var twin := hero.duplicate(true)
twin["stats"]["hp"] = 50
print(hero["stats"]["hp"]) # 1Bản sao nông là đủ khi mọi giá trị đều là số, chuỗi hoặc giá trị boolean. Khi một giá trị là mảng hoặc từ điển, hãy dùng duplicate(true). Mảng cũng hoạt động tương tự: grid.duplicate(true) sao chép mảng 2D cùng với các hàng của nó.
Thử thách
DễTạo một đợt kẻ địch từ một mẫu. Từ điển template đã có sẵn. Chương trình đọc hai số nguyên, mỗi số trên một dòng: số lượng kẻ địch cần tạo (n) và điểm thưởng hp.
Với mỗi kẻ địch có số thứ tự i từ 1 đến n:
- Tạo một bản sao của
templatekhông dùng chung dữ liệu với mẫu. - Thêm khóa
"id"với giá trịi. - Cộng
bonus * ivào"hp"bên trong"stats". - Nếu đây là kẻ địch cuối cùng, thêm
"crown"vào"loot"của nó. - In kẻ địch ra.
Cuối cùng, in Template: theo sau là mẫu, mẫu này phải giữ nguyên. Với đầu vào 2 và 10, đầu ra là:
{ "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"] }Tự làm thử
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())
# Tạo và in ra n kẻ địch
# In ra template
pass
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Chuyên sâu về chuỗi
Các phương thức của chuỗiTìm kiếm trong chuỗiThay thế và xóa khoảng trắngTách và nốiÔn tập: Kiểm tra tên người dùng7Kiểu liệt kê
Kiểu liệt kê là gì?Định nghĩa kiểu liệt kêCác giá trị của kiểu liệt kêKiểu liệt kê trong matchÔn tập: đèn giao thông10Hàm nâng cao
Trả về nhiều giá trịHàm lambda phần 1Hàm lambda phần 2Ôn tập: sắp xếp bằng lambdaHàm đệ quy phần 1Hàm đệ quy phần 2Ôn tập: tính tổng mảng lồng nhau13Hệ thống quản lý hàng tồn kho
Tổng quan dự ánThêm mặt hàng2Ra quyết định nâng cao
So khớp với biếnĐiều kiện bảo vệ trong so khớpMẫu mảngMẫu từ điểnKiểm tra thành viênÔn tập: Bộ phân tích lệnh5Ứng dụng sổ liên lạc
Hiển thị menuThêm liên hệ8Trình quản lý hồ sơ học sinh
Tổng quan dự ánThêm học sinh3Mảng nhiều chiều
Cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuÔn tập: mảng 2 chiềuMảng răng cưaCác mẫu phổ biến với mảng 2 chiềuÔn tập: bàn cờ6Tập hợp với từ điển
Tập hợp là gì?Từ điển như một tập hợpThêm và xóaHợp và giaoHiệu tập hợpÔn tập: Xóa phần tử trùng lặp9Tổng hợp dữ liệu nâng cao
Tính tổng các giá trịTìm giá trị nhỏ nhất và lớn nhấtSắp xếp tùy chỉnhÔn tập: Sắp xếp từ điểnTự luyện tập: Trình biên dịch GDScript online