python 实例化以后属性更新问题
本人刚刚接触Python
, 目前使用python 3.6
, 遇到了一点关于类属性的问题, 代码如下:
class A():
def __init__(self):
self.x = 0
self.y = 0
self.z = [self.x, self.y]
def add_one(self):
self.x += 1
# self.z = [self.x, self.y]
a = A()
a.add_one()
print(a.x) # 1
print(a.z) # [0, 0]
问题如下:
假设在add_one
方法里面没有self.z = [self.x, self.y]
这段代码, 可以发现虽然x
是更新了, 但是z
并没有随着x
的更新而更新, 除非手动加上这段代码才可以实现更新, 请问这是为什么?
另外请教一下有没有其他可以更加简便的方法进行对属性的更新? 因为目前这种代码更新起来很麻烦, 增加一个更新方法就需要将所有被更新的属性手动更新一次
愿有前辈能指点一下, 若有表述不当, 请见谅!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
用
@property
将函数包装为属性python3
因为你直接修改了
self.x
的整个引用。self.x += 1
的操作是将self.x
的指向从原先指向的值改为指向另一个值,而不是将其所指向的值修改为另一个值,而self.z
仍然存储着原先self.x
指向的旧的值,当然不会跟着更新。要达到你想要的类似的效果,可以试试与实例化与否无关。
上述代码对
a
和b
指向的值本身进行了修改,而非修改整个引用使其指向新的值。也就是说,修改后的a
和b
的指向并没有改变(而self.x += 1
修改了self.x
的指向),因此c
的两个元素仍能通过其引用找到与当前a
和b
一致的值