为了账号安全,请及时绑定邮箱和手机立即绑定

为什么类属性为列表或字典,实例修改会发生变化

class Person(object):

  count = [0]

  def __init__(self,name):

    self.name=name


p1=Person('Sunny')

p1.count.append(1)

print Person.count

正在回答

3 回答

自己个人总结:类属性是列表时,append是列表内置方法(可用dir(list)来查找);所以相当于调用类方法来修改类属性;而不是通过实例修改的。。。表述欠佳,欢迎大家纠正

0 回复 有任何疑惑可以回复我~

个人理解。

一般情况下,类属性在定义类时就确定了。但.append()是在原处修改,所以类属性就被改变了。但这并不说明类属性为列表或字典,实例修改就一定会发生变化。你可以试着把 p1.count.append(1) 改为p1.count = p1.count + [1],就会发现……

1 回复 有任何疑惑可以回复我~

我自己的理解:这里你不是给实例添加了一个属性,而是直接调用了类属性,实例没有自己的新的添加属性,因此是直接修改的类属性

class Person(object):

     count = []

     def __init__(self,name):

            self.name=name

            p1=Person('Sunny')

            p1.count=[]

p1.count.append(1)

print p1.count


print Person.count

你试试这个,原来的那个实例的新属性没有覆盖,因此修改的是类属性的值,当实例有了新的覆盖属性是,就直接修改的是实例属性值,回答的不好,希望可以帮到你


0 回复 有任何疑惑可以回复我~
#1

qq_北冥之雪_0 提问者

你这个相当于重新给实例p1定义了一个实例属性count;根据实例属性的查找规则,先查找实例本身的属性,找不到再找类属性;这样没有对类中count进行修改
2017-08-06 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255532    人
  • 解答问题       3038    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

为什么类属性为列表或字典,实例修改会发生变化

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号