Python
オブジェクト指向
Python3
オブジェクト
変数

pythonでの、変数の処理について詳しく調べてみた

More than 1 year has passed since last update.

運営ブログの記事はこちらpythonの秀逸なオブジェクト保存方法の設計

ここでは、インタープリタで見る、python変数の処理について書いていきます。ファイルから実行する場合には、うまいことググってみてください。

主に、やることとしては「変数を呼び出したいところ(varとかってやってるところ)で、『print var』ってやる」くらいだと思いますが、、


変数の作り方

「変数 = オブジェクト」の順に記入するだけです。


test

var = 9



呼び出し方

 ただ、「var」ってうつ


test

var #9



変数を定義する時に裏側で行われてる 事(多分)


  1. 変数を保存(var)

  2. ポインタ(=の仕事)を用意して、オブジェクトの保存先を変数に記憶


  3. 実際の値(オブジェクト)の割り当て(ここでは9)

    Objectのメモリ空間に含まれる者は、


    1. オブジェクトの値(9)

    2. Type Information(つまりデータ型、Integer)

    3. Reference Counter(変数の入っているアドレス)」



  4. 呼び出す時は、”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の値は変わらないはず

試してみる。


test

var = 20

var1 = var

var = 30 #var1はvarとは無関係なので、var1の値はそのままのはず。

var #30
var1 = 20



確認②listのappendで新しい値を追加してみる。

同じ値を参照しているはずだから、代入( = )じゃなくて追加( append )の場合ならば、両方とも値は変化するはず。


test

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)は両方とも変更される。(こんがらがってきた、、)


つまり、


  1. 新しく変数に値を代入( = を使う)ー>新しくオブジェクトを作成するので、互いに完全に独立になる。

  2. 新しく変数に値を代入しない( = 使わない)ー>参照している先は同じなので、どっちかを変更すると両方値が変わる

てことは、途中にlist1 = [1,2]とかってのを足してあげると、list1とlist2は完全に独立になるので、結果は変わるはず!


test

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]


ということで個人的には腑に落ちたのでした。(自分の頭でしっかり理解しないと、読んでも絶対わからなそう、、)