正如@David Robinson 指出的那样,听起来您正在尝试重新实现dict
的功能。但是,为了解决最初的问题,您遇到的问题是字符串是不可变的。当您编写时,您正在更改'sobj_B.graph[0][1].name = 'jill'
实例中保存的引用,而不是 in 中的引用。考虑以下: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):
等。这对于您的类是new-style是必要的,这是非常可取的。旧式类(不继承自object
)只是为了向后兼容。在 Python 3 中,这不再是必需的,因为所有类都是新样式的。