Python ― みくるの大小 

>>> class Chara:
	def __init__(self,s):
		self.name = s

#とりあえず、前回と同じクラスを使う。

>>> cl = [Chara('Haruhi')]
>>> cl += [Chara('Mikuru')] #cl = cl + [Chara('Mikuru')]でもいい。
>>> cl
[<__main__.Chara instance at 0x00DB9D78>, <__main__.Chara instance at 0x00DB9DC8>]

#いうまでもなく、cl[0]とcl[1]は別のインスタンスなので、別々のアドレスに格納されている。とりあえず、年齢でも設定しておこう。

>>> cl[1].age = 17

#さて、もう1つself.name='Mikuru'なインスタンスが欲しい。

>>> cl += cl[1]

Traceback (most recent call last):
  File "", line 1, in 
    cl += cl[1]
TypeError: iteration over non-sequence

#↑初歩的な間違い。

>>> cl += [cl[1]]
>>> cl
[<__main__.Chara instance at 0x00DB9D78>,
<__main__.Chara instance at 0x00DB9DC8>,
<__main__.Chara instance at 0x00DB9DC8>]

#読みやすくするために、折り返しを入れた。#clにcl[1]をもう1つ加えたが、cl[1]とcl[2]は同じアドレスに入っている。

>>> cl[2].age = '(Confidential)'
>>> cl[1].age
'(Confidential)'

#当然だが、cl[2].ageを「(Confidential)」にしたため、cl[1].ageもそうなってしまった。

#(俺たちに必要なのは、全く同一の2人の みくる じゃない。みくるとそのコピーなのだ。)

>>> cl[1].age = 17 #cl[1]のageを元に戻した。
>>> import copy #copyモジュールをインポートする。
>>> cl[2] = copy.copy(cl[1]) #cl[2]にcl[1]のコピーを入れる。
>>> cl
[<__main__.Chara instance at 0x00DB9D78>,
<__main__.Chara instance at 0x00DB9DC8>,
<__main__.Chara instance at 0x00DC3C60>]

#今度はcl[1]とcl[2]のアドレスが違うものになっている。

#これで、cl[2].ageを書き換えても、cl[1].ageは変わらないはず。

>>> cl[2].age = '(Confidential)'
>>> cl[1].age
17

[2007/12/29 09:57] Python | TB(0) | CM(3)