@David Robinsonが指摘したように、dict
の機能を再実装しようとしているようです。ただし、元の質問に対処するには、文字列が不変であるという問題があります。を記述すると、のobj_B.graph[0][1].name = 'jill'
インスタンスに保持されている参照が変更されますが、 の参照は変更されません。次の点を考慮してください。a
name
obj_B.graph
>>> a = 'hello'
>>> b = a # b is now a reference to the same str object as a
>>> id(a)
4305179104
>>> id(b)
4305179104
>>> b is a
True
>>> a = 'goodbye' # create a new str object in the heap, and change the reference belonging to a
>>> id(a)
4305179152 # not the same object as before!
>>> id(b)
4305179104 # b is the same
>>> b is a
False
これを、その場で変更される可変型と比較してください。
>>> a = [1,2,3]
>>> b = a
>>> a.append(4) # we are not reassigning a, just modifying the list object it points to
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3, 4]
>>> b is a
True
これは、参照が名前空間の変数であるか、リストのエントリであるかに関係なく適用されます。
元の質問に対する解決策はname
、メソッドを作成し、次のように呼び出しでアクセスすることです。
class A(object):
def __init__(self, name):
self._name = name
def set_name(self, name):
self._name = name
def get_name(self):
return self._name
>>> l = []
>>> a = A('jack')
>>> l.append((a.get_name, a))
>>> l[0][1].set_name('jill')
>>> l[0][0]()
'jill'
または、クラスに__str__
メソッドを指定し、それを使用して名前を返すこともできます。そうすれば、リスト内の単一のエントリのみが必要になります。
class A(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
>>> l = []
>>> l.append(A('jack'))
>>> str(l[0])
'jack'
>>> l[0].name = 'jill'
>>> str(l[0])
'jill'
PS、Python 2.x を使用している場合、作成するすべてのクラスは から継承する必要がありますobject
。つまり、クラス定義は etc を読み取るclass a(object):
必要があります。これは、クラスがnew-styleであるために必要であり、非常に望ましいです。古いスタイルのクラス ( から継承されないobject
) は、単に後方互換性のために存在します。Python 3 では、すべてのクラスが新しいスタイルであるため、これは不要になりました。