運営ブログの記事はこちらpythonの秀逸なオブジェクト保存方法の設計
ここでは、インタープリタで見る、python変数の処理について書いていきます。ファイルから実行する場合には、うまいことググってみてください。
主に、やることとしては「変数を呼び出したいところ(varとかってやってるところ)で、『print var』ってやる」くらいだと思いますが、、
#変数の作り方
「変数 = オブジェクト」の順に記入するだけです。
var = 9
#呼び出し方
ただ、「var」ってうつ
var #9
#変数を定義する時に裏側で行われてる 事(多分)
-
変数を保存(var)
-
ポインタ(=の仕事)を用意して、オブジェクトの保存先を変数に記憶
-
実際の値(オブジェクト)の割り当て(ここでは9)
Objectのメモリ空間に含まれる者は、- オブジェクトの値(9)
- Type Information(つまりデータ型、Integer)
- Reference Counter(変数の入っているアドレス)」
-
呼び出す時は、”Pointer”を使ってObjectを参照するだけ
Pointerは「=」によって定義されてます。= がないとsyntax errorが出ます
#具体例var1 = var とした時に何が起こっているのか
間違い
「var1 は var を呼び出す。そのあと、var がオブジェクト 9 を呼び出している」
正しい
「var1 は var と同じオブジェクトを参照する。 var1 は直接 オブジェクト9を呼び出している」
##確認① var1 = var
まず、var1 = var とする。ここで、仮説を以下のように置く(めっちゃ理系だ。。)
var1 が**直接**オブジェクトのアドレスを参照しているということは
var1 と varは完全に独立(なはず)。
varに新しく何かを**代入(=)**して見る。
varがvar1と完全に独立ならば、varに新しいオブジェクトを代入しても
var1の値は変わらないはず
試してみる。
var = 20
var1 = var
var = 30 #var1はvarとは無関係なので、var1の値はそのままのはず。
var #30
var1 = 20
##確認②listのappendで新しい値を追加してみる。
同じ値を参照しているはずだから、**代入( = )じゃなくて追加( append )**の場合ならば、両方とも値は変化するはず。
list1 = [1,2] #list1 [1,2]
list2 = list1 #list2 [1,2]
list1.append(3) # " = " は使ってないからlist2の参照先に新しい値が追加される
list1 #[1,2,3]
list2 #[1,2,3]
やっぱり、代入じゃない限り、変数の参照する先はまったく同じになるらしい。追加とかスライスを行った場合には、変数(ここでは、list1とlist2)は両方とも変更される。(こんがらがってきた、、)
##つまり、
- 新しく変数に値を代入( = を使う)ー>新しくオブジェクトを作成するので、互いに完全に独立になる。
- 新しく変数に値を代入しない( = 使わない)ー>参照している先は同じなので、どっちかを変更すると両方値が変わる
てことは、途中にlist1 = [1,2]
とかってのを足してあげると、list1とlist2は完全に独立になるので、結果は変わるはず!
list1 = [1,2] #list1 [1,2]
list2 = list1 #list2 [1,2]
list = [1,2] #値が同じだけど、" = "を使っているので、全く新しいオブジェクトが作成され、list2とは独立(無関係になる)
list1.append(3) # " = "は使っていないが、新しく作成されたlist1のオブジェクトに値が追加される。list2は無関係なので、そのまま
list1 #[1,2,3]
list2 #[1,2]
ということで個人的には腑に落ちたのでした。(自分の頭でしっかり理解しないと、読んでも絶対わからなそう、、)