Pythonの変数はリファレンスという仕組みを使っている。
例えば

a = 1
b = 1

という代入文があったとしたら、これは変数aもbもおなじオブジェクト(数値の1)を参照しているという事だ。
なので

id(a)
id(b)

を実行してみるとそれぞれ同じIDが出力されるはずだ。
その後

b = 2

とすれば変数bはオブジェクト(数値の2)を参照することになり

id(a)
id(b)

を見てみるとここでは違ったIDが出力される。

では

a = 1
b = a

とした場合はどうだろうか?

変数bは変数aを通じて同じオブジェクトを参照している。
当然

id(a)
id(b)

を実行してみると同じIDだ。
そして

b = 2

とした場合、変数aも2になっているかと思いきやaは1のままである。
最初同じオブジェクトを参照していたが"b = 2"を実行した事によりbの参照だけが更新された感じだ。

同じような事が文字列でもいえる。

a = "Python"
b = "Python"
c = b

として

id(a)
id(b)
id(c)

とすると
すべて同じIDだ。

その後

b = "Perl"

を実行したら変数bだけが更新される。

Rubyでもだいたい同じような結果になるが、Rubyの場合同じ文字列でも別々で代入を行った場合

a = "Ruby"
b = "Ruby"
a.object_id
b.object_id

の結果は違ってくる。

c = b

とした時は同じIDだ。

これはPythonは文字列を効率よく扱っていてたとえ変数への代入が別々だったとしても全く同じ文字列であれば「とりあえずは同じオブジェクトを参照しててね」って事なんだろう。
ちなみに文字列が日本語の時は駄目だった。あと、たとえ欧文でもやたらと長かったりすると駄目なようだ。また

a = "less than"
b = "less than"

みたいに文字列の中に空白が入ったりしても違ったIDになってしまう。

Rubyのシンボルみたいな感じなのかな。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/11

コメントする