|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- class A():
- lst1=[1,2,3]
- lst2=[1,2,3]
- def __init__(self):
- self.lst1=10
- self.lst2[2]=10
- a=A()
- print(A.lst1)
- print(a.lst1)
- print(A.lst2)
- print(a.lst2)
复制代码
- print(A.lst1) # 打印结果 [1, 2, 3]
- print(a.lst1) # 打印结果 10
- print(A.lst2) # 打印结果 [1, 2, 10]
- print(a.lst2) # 打印结果 [1, 2, 10]
复制代码
为什么 A.lst1和a.lst1打印结果不一样,但 A.lst2 和a.lst2 结果又一样呢
本帖最后由 sunrise085 于 2020-9-15 19:37 编辑
2楼说的才有点道理,但不是被替换,一个是被覆盖屏蔽了,一个是被修改了
在__init__中,self.lst1=10,是直接定义实例属性lst1,并对其进行赋值这就屏蔽了类属性lst1,当用实例对象懂lst1的时候调用的就是实例属性lst1,而非类属性lst1
在__init__中,self.lst2[2]=10,相当于直接修改实例属性lst2[2],要修改,那就需要先找找是否定义了,若没有定义,则会报错,会先找实例属性lst2,发现没找到,然后再向上一层找类属性lst2,找到了!然后就对其进行了修改。这相当于实际上没有实例属性lst2,一直使用的都是类实例属性lst2
所以才会出现如此运行结果。
通过此例可以看出,类实例化中,列表是全局的,不管你怎么实例化,修改的都是类中原来的属性。
你这句话是不对的,你可以看看下面的运行结果
- class A():
- lst1=[1,2,3]
- lst2=[1,2,3]
- def __init__(self):
- self.lst1=10
- self.lst2=[3,5,7]
- a=A() #在这里的时候,类属性lst2就已经被修改了。而不是想你说的,到第二次打印a.lst1的时候才覆盖。
- print(A.lst1)
- print(a.lst1)
- print(A.lst2)
- print(a.lst2)
复制代码
对于可变对象和不可变对象修改和定义的一些区别,尤其是在函数中修改,可以看看我写的这个帖子的第四部分。或许能理解的更好一些
|
|