文法・環境 辞書

【python】辞書(dict)をコピーする方法【参照渡し、値渡し、キーと値コピー】

pythonの辞書をコピーする方法について紹介します。

本記事では、下記の内容について紹介しています。

この記事で分かること

  • 辞書のコピーの注意点【参照渡しと値渡しの違い】
  • 辞書のキーと値をコピーする方法
  • 辞書のキーだけコピーする方法

スポンサーリンク

辞書のコピーの注意点【参照渡しと値渡しの違い】

コピーには、「参照渡し」でのコピーと、「値渡し」でのコピーがあり、それぞれ挙動が異なります

それぞれのコピーの違いを理解していないと、思わぬバグに繋がることもあるので注意が必要です。

参照渡しと値渡しの違い

【参照渡し】:変数の id(アドレス)を渡します

【値渡し】:変数に格納された値をコピーして渡します。

以下、「参照渡し」で辞書をコピーするサンプルコードです。

### 「参照渡し」で辞書をコピー
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = fruits_dict1

print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}

fruits_dict1.update(Apple = 200)

print(fruits_dict1)
# {'Apple': 200, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 200, 'Banana': 200, 'Orange': 100}

fruits_dict2.update(Apple = 300)

print(fruits_dict1)
# {'Apple': 300, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 300, 'Banana': 200, 'Orange': 100}

「参照渡し」でのコピーは、値が保管されている場所の情報を渡します。

実体が同じものの id を渡しているだけなので、片方の変数の値を変更するともう一方の変数の値も変わってしまいます

「参照渡し」でコピーされた変数の "オブジェクトID" を確認してみます。
オブジェクトIDは、id関数で確認できます。

### 参照渡しの変数のidを確認
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = fruits_dict1

print(id(fruits_dict1))
# 1601761757728
print(id(fruits_dict2))
# 1601761757728

2つの変数 " fruits_dict1 "と、" fruits_dict2 "のオブジェクトIDは同じ値となっています。

スポンサーリンク

辞書のキーと値をコピーする方法

辞書の "キー" と "値" を別の辞書へコピーする場合は、「値渡し」でのコピーをオススメします。

辞書を「値渡し」でコピーする場合は、辞書のcopyメソッドを使用します。

以下、「値渡し」で辞書をコピーするサンプルコードです。

### 「値渡し」で辞書をコピー
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = fruits_dict1.copy()

print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}

fruits_dict1.update(Apple = 200)

print(fruits_dict1)
# {'Apple': 200, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}

「値渡し」で辞書をコピーした場合は、一方の変数を変更しても、もう一方の変数の値は変わりません

「値渡し」でコピーされた変数の "オブジェクトID" を確認してみます。

### 値渡しの変数のidを確認
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = fruits_dict1.copy()

print(id(fruits_dict1))
# 2291788760624
print(id(fruits_dict2))
# 2291788697320

2つの変数 " fruits_dict1 "と、" fruits_dict2 "のオブジェクトIDは同じ値となっています。

【補足】dict関数で辞書のキーと値をコピーする方法

補足的な内容ですが、dict関数を用いても、辞書の "キー" と "値" を「値渡し」でコピーできます

以下、dict関数を用いて「値渡し」で辞書をコピーするサンプルコードです。

### dict関数を用いて「値渡し」で辞書をコピー
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = dict(fruits_dict1)

print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}

fruits_dict1.update(Apple = 200)

print(fruits_dict1)
# {'Apple': 200, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}

スポンサーリンク

辞書のキーだけコピーする方法

辞書のキーだけコピーする方法について紹介します。

fromkeys関数を用いることで、辞書のキーだけコピーすることができます。

辞書のキーだけコピー

新しい辞書 = dict.fromkeys( 辞書, 値 )

以下、辞書のキーだけコピーするサンプルコードです。
新しい辞書の値には、Noneを指定しています。

### 辞書のキーだけコピー
fruits_dict1 = {'Apple':100, 'Banana':200, 'Orange':100}

fruits_dict2 = dict.fromkeys(fruits_dict1, None)

print(fruits_dict1)
# {'Apple': 100, 'Banana': 200, 'Orange': 100}
print(fruits_dict2)
# {'Apple': None, 'Banana': None, 'Orange': None}

スポンサーリンク

まとめ

pythonの辞書をコピーする方法について、紹介しました。

参照渡し(浅いコピー)は思わぬバグに繋がりやすいので、コピーする際は気をつけるようにしましょう。

スポンサーリンク

-文法・環境, 辞書
-,