python 实例化以后属性更新问题

发布于 2022-09-08 00:03:42 字数 665 浏览 43 评论 0

本人刚刚接触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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

流星番茄 2022-09-15 00:03:42

@property 将函数包装为属性

python3

>>> class A():
    def __init__(self):
        self.x = 0
        self.y = 0
        
    @property # 将函数包装为属性
    def z(self):
        return [self.x, self.y]

    def add_one(self):
        self.x += 1

        
>>> a=A()
>>> a.add_one()
>>> a.x
1
>>> a.z
[1, 0]
>>> 
心的位置 2022-09-15 00:03:42

因为你直接修改了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)

与实例化与否无关。

上述代码对ab指向的值本身进行了修改,而非修改整个引用使其指向新的值。也就是说,修改后的ab的指向并没有改变(而self.x += 1修改了self.x的指向),因此c的两个元素仍能通过其引用找到与当前ab一致的值

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文