Python.use(better)《余録》代入 vs. 束縛 #2

記事一覧Python.use(better)
《余録》代入 vs. 束縛 #2《Python3.1》

《著》真樹育未《監修》小泉ひよ子とタマゴ倶楽部
第0版♪1988/10/12

Smalltalk-80 セミナー用に作成したテキスト(1988)をもとに、Jython 版(2003)を経て、Python 版(2009)として加筆/再構成した余録集です。

変数:代入モデルの隘路

代入モデルでは、オブジェクトを入れるのに「必要な大きさの箱」が用意されると考えます。


■ 変数に値を代入する(初期化)
    
Traceback (most recent call last): File "", line 1, in NameError: name 'a' is not defined
変数 a が未定義だと、例外 NameError を生成して、エラーメッセージを出力します。
    
>>> hex(id(a)) '0x2f9b40'
3
変数 a にオブジェクト 3 を代入するときには、それを入れるのに「必要な大きさの箱」が用意されるはずです。 変数 a の値を参照すると、オブジェクト 3 が得られます。
■ 変数に値を代入する(再設定)
>>> b = 4
>>> hex(id(b))
'0x2f9b50'
変数 a に別の(変数 b によって参照される)オブジェクトを代入するときにはどうでしょう。
    
>>> hex(id(a)) '0x2f9b50'
4
このとき、別のオブジェクトを入れるのに「必要な大きさの箱」が用意されるのでしょうか。というのは、別のオブジェクトを入れるのに、その箱の大きさが十分とは限らないからです。さらに、いくつかの疑問が浮かびます。代入の前後で、それぞれの箱の中身はどうなるのでしょうか。変数 a の箱に入れてあったオブジェクト 3 は、その後はどうなるのでしょうか。変数 b の箱に入れてあったオブジェクト 4 は、その後はどうなるのでしょうか。
■ 変数を削除する
>>> del a
>>> a
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'a' is not defined
変数 a を削除すると、オブジェクトを入れる箱は不要になります。
>>> hex(id(3))
'0x2f9b40'
>>> hex(id(4))
'0x2f9b50'
このとき、不要になった箱に入れてあったオブジェクト 4 は、その後はどうなるのでしょうか。

変数:束縛モデル

では、束縛モデルを使って、同じ現象を説明します。束縛モデルにおける原則は
  • 変数の存在(介入)の有無は、オブジェクトに影響を与えない
ことです。 一度生成されたタグは、変数が消滅するまで「必ず」任意のオブジェクトと結ばれます。タグは、いつでも「自由に」結び直したり、不要になったらいつでも「自由に」処分できます。なぜなら、タグはオブジェクトに影響を与えないからです。タグが消滅しても、オブジェクト自身が消滅することはありません。また、タグが結ばれた(束縛された)状態のオブジェクトは、まだ参照される可能性があるので、リサイクルの対象にはなりません。

Tips

タグモデルでは、単純な原則によって、さまざまな現象をうまく説明できます。代入モデルで、同じ現象を説明しようとすると、いくつもの複雑な原則を適用しなければならなくなります。 》作業中です《
Last updated♪2009/07/22