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()は浅いコピーを作成します。コピーは独自のキーと値のペアを持ちますが、配列または辞書である値は、2つの間で共有されたままです。

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)は内部のすべての配列と辞書もコピーするため、2つの間で共有されるものはありません。

var twin := hero.duplicate(true)
twin["stats"]["hp"] = 50
print(hero["stats"]["hp"]) # 1

すべての値が数値、文字列、またはブール値の場合は、浅いコピーで十分です。値が配列または辞書の場合は、すぐにduplicate(true)を使用してください。配列も同様に動作します。grid.duplicate(true)は、2次元配列を行とともにコピーします。

challenge icon

チャレンジ

簡単

テンプレートから敵の一群を生成します。辞書 template が与えられます。プログラムは、敵を何体生成するか(n)と hp ボーナスの2つの整数を、1行に1つずつ読み取ります。

1 から n までの各敵番号 i について:

  1. template と何も共有しないコピーを作成します。
  2. 値 i を持つキー "id" を追加します。
  3. "stats" 内の "hp" に bonus * i を加算します。
  4. 最後の敵であれば、その "loot" に "crown" を追加します。
  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オンラインコンパイラ