在Python中,变量不直接存储值,而是存储值的引用。列表、元组、字典、集合以及其他容器类对象中的元素也是存储值的引用。对象中的成员也是存储的引用。
自定义类的数据成员是该类所有对象共有的,既可以通过类访问,也可以通过该类任意对象进行访问。
如果通过类把成员的值进行了修改,该类对象都能得到体现。然而,如果通过其中某个对象修改了value的值,不会影响类和该类其他对象,因为这样实际上是修改了对象中成员的引用。
如果类的数据成员是可变序列,并且通过可变序列自身的原地修改方法或者下标方式修改部分元素,那么通过类或者该类任意对象都可以实现统一的影响。
为了便于理解类和对象的内存管理,可以打开这个网址http://pythontutor.com/live.html#mode=edit,然后输入代码观察内存的使用的变化。例如,刚创建类和对象时,
修改t1.value的值之后,t1.value不再共享类的数据成员。
修改T.value之后,不影响已改变的t1.value,并且t2.value仍然共享类的数据成员。
类似地,当类成员value为列表[1,2,3]时,相应的一系列修改之后,内存布局如图,不管是通过类还是通过该类的对象,使用列表自身的原地修改方法或者下标的形式,修改的都是同一个列表。
自定义类中的方法也遵守同样的规则。
如果修改了对象的成员引用之后,仍想访问对象所属类的成员,可以使用下面的方法。