辞書型 コピー

Python学習【365日チャレンジ!】24日目のマスターU(@Udemy11)です。

なにげに12の倍数って好きなんです。

12って、干支の数で、12歳、24歳、36歳、48歳って年男、年女って言われるので、12の倍数に馴染みがあるってのもあるかもしれません。

Puthon学習【365日チャレンジ!】も、そんな12の倍数となる24日目に入りました。

あと1週間で2つ目の目標としている30日に到達しますが、基礎基本となるターミナルやPythonista・Pycharmの操作もそれなりに慣れてきた気がします。

それでは、本日の学習を進めていきましょう!

昨日の復習

昨日は、辞書型の代表的なメソッドを学習しました。

>>> d = {'x': 10, 'y': 20, 'z': 30}
>>> d.keys()
dict_keys(['x', 'y', 'z'])
>>> d.values()
dict_values([10, 20, 30])
 
>>> e = {'x': 50, 'i': 60}
>>> a.update(e)
{'x': 50, 'y': 20, 'z': 30, 'i':60}
 
>>> a.get('y')
20
>>> type(a.get('k'))
<class 'NoneType'>
 
>>> a.pop('x')
50
 
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

一気に書いてしまいましたが、次のようなメソッドが出てきました。

  • keys()
  • すべてのkeyを抽出する

  • values()
  • すべてのvalueを抽出する

  • update()
  • 新しい辞書型変数と同期させる

  • get()
  • 指定したkeyの値を抽出する。(keyが存在しない場合はNoneを返すNonTypeになります)

  • pop()
  • 指定したkeyと対の値を取り除く

  • del
  • 指定した変数のkeyとvalueを削除したり、変数そのものを削除する

最後のdelは強力で、変数自体を削除してしまうため、変数を削除してしまうと変数を表示しようとしてもエラーが返されます。

他にもメソッドは用意されていますが、講座を進めつつ、必要に応じて憶えていくことにします。

それでは、本日の学習に入りますね。

辞書型は参照渡し

辞書型は、リスト型と同じようにいろいろなメソッドが使えるのと同様に、先に定義している変数を新しい変数に代入するときは、値渡しではなく、参照渡しになります。

リストの値渡しと参照渡しで学習したのと同じですが、辞書型で確認してみましょう。

d = {'x': 10, 'y': 20}
e = d
e['x'] = 30
print(e)
print(d)

出力結果

{'x': 30, 'y': 20}
{'x': 30, 'y': 20}

リスト型で学習したように、2つ目の変数eは、1つ目の変数dを参照しているだけなので、参照しているkeyであるxの値を変更することになり、変数dの値も変わってしまいます。

これはまさにリスト型と同じことで、変数dが変数eの値を借りている状態ということです。

copyメソッドを使う

リスト型と同じように、最初に定義した変数の値を変更せずに、値渡しで新しい変数を定義するにはcopy()を使用します。

d = {'x': 10, 'y': 20}
e = d.copy()
e['x'] = 30
print(e)
print(d)

出力結果

{'x': 30, 'y': 20}
{'x': 10, 'y': 20}

copyを使用することで、参照渡しではなく、値渡しになるので、もとの変数dから値をコピーして新しい変数eを定義します。
なので、変数eの値を変更しても、元の変数dは変更されることはありません。

今回はちょっと軽め

今回の内容は少し軽めで一つだけのメソッドになりましたが、help()でリスト型と辞書型のメソッドをチェックしてみると、2つのタイプに共通するメソッドは次の2つでした。

  • copy()
  • pop()

今回紹介したcopy()と値を取り出すpop()ですが、copyは両方のタイプとも同じようにparenthesesの丸括弧の中に何も入れなくても変数全体をコピーしてくれます。

一方で、popはリスト型で使用するときは、parenthesesの丸括弧の中に何も入れなくてもリストの後ろから値を取り出してくれますが、辞書型で使うときは、keyを指定する必要があります。

i = [1, 2, 3, 4]
i.pop()
print(i)
 
a = {'x': 10, 'y': 20, 'z': 30}
a.pop('x')
print(a)

出力結果

[1, 2, 3]
{'y': 20, 'z': 30}

リストと同じように、()に何も指定せず、辞書型の最後のペアを取り除くメソッドはないのかなと思って、ヘルプで出力されたメソッドを眺めているとそれらしいものがありました。

それがpopitem()です。

a = {'x': 10, 'y': 20, 'z': 30}
a.popitem()
print(a)

出力結果

{'x': 10, 'y': 20}

keyとvalueが対になったアイテムを取り除くイメージですね。

このように、同じような操作をするしても、タイプの違いでメソッドが変わったり、そのまま使って同じような操作ができたりするので、いろいろと試してみると密かな喜び!?を得ることができます。

こういったことを楽しめるかどうかが、Python上達の鍵じゃないかと思っているので、どんどん試して小さな経験を積み上げていこうと思います。

helpを使えば、いろいろなメソッドやオブジェクトが出てくるので、気になったものは、どんどん試してみましょう!

それでは、Good Python!