リストについて②
今回の記事もリストについて取り扱っていきます。
リストには、変数にオブジェクトが保存されているのではなく、変数にはオブジェクトの参照が保存されています。なんだかよく分からないですよね。もうちょっと詳しく見ていきましょう。
例えば、次のようなリストを作ります。
a = ['apple', 'lemon', 'orange']
この時、変数aにはオブジェクトが保存されているわけではありません。しかし、printなどの関数を使うと、オブジェクトにアクセスすることができます。なぜなら、変数aにはオブジェクト['apple', 'lemon', 'orange']の参照(場所)が保存されているからです。
ここまでの説明で、変数に実際にオブジェクトが保存されていても、参照が保存されていても、関係ないではないかと思うかもしれません。しかし、ここの部分をしっかりと押さえていないと、不具合が生じることがあります。なぜなら、
a = ['apple', 'lemon', 'orange']
b = a
という風に書いた時には、bにもオブジェクトの参照が代入され、また
a[0] = 'banana'
という風に書いた場合にはオブジェクトそのものに代入するからです。
どういう不具合が起きるかを、実際に見ていきましょう。
a = ['apple', 'lemon', 'orange']
b = a
a[0] = 'banana'
print(a)
print(b)
実行結果
['banana', 'lemon', 'orange']
['banana', 'lemon', 'orange']
どういうことかわかりましたか?もしもリストの変数に参照ではなくオブジェクトそのものが代入されているのなら、b = aとしたときにはaのオブジェクトがbにコピーされ、その時点でaとbは関係がなくなります。しかし、実際には参照がコピーされるため、aもbも同じオブジェクトを参照していることになっています。そのため
a[0] = 'banana'のように、オブジェクトを直接書き換えると、同じオブジェクトを参照しているbにも影響がでてしまうのです。
今回の記事はこれで終わりです。お疲れさまでした。