正如@大衛·羅賓遜指出,這聽起來像你試圖重新實現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
繼承的類。也就是說,你的classdefs應該閱讀class a(object):
等等,這是必要的你的類是新型,這是highly desirable。舊式類(不從object
繼承)僅僅是爲了向後兼容。在Python 3中,這不再是必要的,因爲所有的類都是新式的。
歡迎來到Stack Overflow!你絕對應該使用一本字典(沒有太多的話要說) –
精神上與'obj .__ dict__'非常相似...... – nneonneo
無論你使用什麼方法,將它封裝在類b中。不要讓用戶必須知道它是如何組織的。提供一個rename()方法或類似的東西。然後,您可以根據需要輕鬆更改您的實施。 –