The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

数独でPythonを 7

Pythonでコードを書き出したとき、最初に引っかかったことについて、忘れないようにメモ。

プログラミング言語には、動的型付けと静的型付けという大きな区分がある。
Pythonは動的型付け言語で、プログラムの実行時に変数の型が決まる。”=”記号の左側に変数名、右側にデータを記載することで、右辺のデータの型で変数の領域が用意され、データの値が代入される。
一方、CやJavaは静的型付け言語で、変数を宣言する時やメソッドの引数や戻り値を指定するときにデータ型を指定する必要がある。
Pythonのデータ型は、後から値を変更出来ない「immutable」な型と、変更可能な「mutable」な型がある。

文字列や数値、タプルはimmutableオブジェクトで、変数aにオブジェクトAを代入し、変数bに変数aを代入した後、変数bに値をオブジェクトBを代入すると、aはA、bはBを示すことになる。id(変数名)を使うと異なるオブジェクトを指していることが確認できる。
一方、list型、dict型、classはmutableオブジェクトで、変数cにオブジェクトCを代入し、変数dに変数cを代入した後、変数dにオブジェクトDを代入すると、オブジェクト内の要素は同じ参照先を指すので、変数cの要素の値が変数dの要素に連動して変ってしまう。

リストや他のオブジェクトを含むクラス・インスタンスのような複合オブジェクトでは、オブジェクトを複製する際に、copyモジュールに、copy.copy() というshallow copyと、copy.deepcopy()というdeep copyの二つのメソッドが用意されている。
shallow copyでは、 新しいオブジェクトを作ると、元のオブジェクトに対する参照を入れる。
一方、deep copyを使うと、新しいオブジェクトを作ると、元のオブジェクトのコピーが別に作られます。

慣れないうちは、id(変数)を使って、確認していくのが安全だ。