Python自定义类的成员并不一直是所有对象共享的

在Python中,变量不直接存储值,而是存储值的引用。列表、元组、字典、集合以及其他容器类对象中的元素也是存储值的引用。对象中的成员也是存储的引用。

自定义类的数据成员是该类所有对象共有的,既可以通过类访问,也可以通过该类任意对象进行访问。

如果通过类把成员的值进行了修改,该类对象都能得到体现。然而,如果通过其中某个对象修改了value的值,不会影响类和该类其他对象,因为这样实际上是修改了对象中成员的引用。

如果类的数据成员是可变序列,并且通过可变序列自身的原地修改方法或者下标方式修改部分元素,那么通过类或者该类任意对象都可以实现统一的影响。

为了便于理解类和对象的内存管理,可以打开这个网址http://pythontutor.com/live.html#mode=edit,然后输入代码观察内存的使用的变化。例如,刚创建类和对象时,

修改t1.value的值之后,t1.value不再共享类的数据成员。

修改T.value之后,不影响已改变的t1.value,并且t2.value仍然共享类的数据成员。

类似地,当类成员value为列表[1,2,3]时,相应的一系列修改之后,内存布局如图,不管是通过类还是通过该类的对象,使用列表自身的原地修改方法或者下标的形式,修改的都是同一个列表。

自定义类中的方法也遵守同样的规则。

如果修改了对象的成员引用之后,仍想访问对象所属类的成员,可以使用下面的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值