本人刚刚接触Python,目前使用python3.6,遇到了一点关于类属性的问题,代码如下:classA():def__init__(self):self.x=0self.y=0self.z=[self.x,self.y]defadd_one(self):self.x+=1#self.z=[self.x,self.y]a=A()a.add_one()print(a.x)#1print(a.z)#[0,0]问题如下:假设在add_one方法里面没有self.z=[self.x,self.y]这段代码,可以发现虽然x是更新了,但是z并没有随着x的更新而更新,除非手动加上这段代码才可以实现更新,请问这是为什么?另外请教一下有没有其他可以更加简便的方法进行对属性的更新?因为目前这种代码更新起来很麻烦,增加一个更新方法就需要将所有被更新的属性手动更新一次愿有前辈能指点一下,若有表述不当,请见谅!
2 回答
不负相思意
TA贡献1777条经验 获得超10个赞
用@property将函数包装为属性python3>>>classA():def__init__(self):self.x=0self.y=0@property#将函数包装为属性defz(self):return[self.x,self.y]defadd_one(self):self.x+=1>>>a=A()>>>a.add_one()>>>a.x1>>>a.z[1,0]>>>
有只小跳蛙
TA贡献1824条经验 获得超8个赞
因为你直接修改了self.x的整个引用。self.x+=1的操作是将self.x的指向从原先指向的值改为指向另一个值,而不是将其所指向的值修改为另一个值,而self.z仍然存储着原先self.x指向的旧的值,当然不会跟着更新。要达到你想要的类似的效果,可以试试a=[]b=[]c=[a,b]print(c)a.append(1)b.append(2)print(c)与实例化与否无关。上述代码对a和b指向的值本身进行了修改,而非修改整个引用使其指向新的值。也就是说,修改后的a和b的指向并没有改变(而self.x+=1修改了self.x的指向),因此c的两个元素仍能通过其引用找到与当前a和b一致的值
添加回答
举报
0/150
提交
取消